Extend Video
curl --request POST \
--url https://api.hooked.so/v1/project/create/extend-video \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"media": "media_video123",
"prompt": "The camera slowly zooms out revealing a beautiful sunset over the ocean",
"targetDuration": 4,
"generateAudio": true
}
'import requests
url = "https://api.hooked.so/v1/project/create/extend-video"
payload = {
"media": "media_video123",
"prompt": "The camera slowly zooms out revealing a beautiful sunset over the ocean",
"targetDuration": 4,
"generateAudio": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
media: 'media_video123',
prompt: 'The camera slowly zooms out revealing a beautiful sunset over the ocean',
targetDuration: 4,
generateAudio: true
})
};
fetch('https://api.hooked.so/v1/project/create/extend-video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hooked.so/v1/project/create/extend-video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'media' => 'media_video123',
'prompt' => 'The camera slowly zooms out revealing a beautiful sunset over the ocean',
'targetDuration' => 4,
'generateAudio' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hooked.so/v1/project/create/extend-video"
payload := strings.NewReader("{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.hooked.so/v1/project/create/extend-video")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hooked.so/v1/project/create/extend-video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"videoId": "vid_extend_abc123xyz",
"projectId": "proj_extend_abc123xyz",
"status": "STARTED"
}
}
{
"success": false,
"message": "media: A video is required"
}
{
"success": false,
"message": "extendVideoSettings.targetDuration: Target duration must be at least 4 seconds"
}
{
"success": false,
"message": "extendVideoSettings.prompt: Prompt is required"
}
Videos
Extend Video
Extend videos using AI to continue and extend your content seamlessly
POST
/
v1
/
project
/
create
/
extend-video
Extend Video
curl --request POST \
--url https://api.hooked.so/v1/project/create/extend-video \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"media": "media_video123",
"prompt": "The camera slowly zooms out revealing a beautiful sunset over the ocean",
"targetDuration": 4,
"generateAudio": true
}
'import requests
url = "https://api.hooked.so/v1/project/create/extend-video"
payload = {
"media": "media_video123",
"prompt": "The camera slowly zooms out revealing a beautiful sunset over the ocean",
"targetDuration": 4,
"generateAudio": True
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
media: 'media_video123',
prompt: 'The camera slowly zooms out revealing a beautiful sunset over the ocean',
targetDuration: 4,
generateAudio: true
})
};
fetch('https://api.hooked.so/v1/project/create/extend-video', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hooked.so/v1/project/create/extend-video",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'media' => 'media_video123',
'prompt' => 'The camera slowly zooms out revealing a beautiful sunset over the ocean',
'targetDuration' => 4,
'generateAudio' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.hooked.so/v1/project/create/extend-video"
payload := strings.NewReader("{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.hooked.so/v1/project/create/extend-video")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hooked.so/v1/project/create/extend-video")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"media\": \"media_video123\",\n \"prompt\": \"The camera slowly zooms out revealing a beautiful sunset over the ocean\",\n \"targetDuration\": 4,\n \"generateAudio\": true\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"videoId": "vid_extend_abc123xyz",
"projectId": "proj_extend_abc123xyz",
"status": "STARTED"
}
}
{
"success": false,
"message": "media: A video is required"
}
{
"success": false,
"message": "extendVideoSettings.targetDuration: Target duration must be at least 4 seconds"
}
{
"success": false,
"message": "extendVideoSettings.prompt: Prompt is required"
}
Try it out! Use the API playground on the right to test the Extend Video endpoint directly.
Overview
Extend Video uses AI (Veo 3.1) to intelligently continue and extend your videos. Perfect for:- Creating longer content from short clips
- Generating smooth video continuations
- Extending storytelling sequences
- Producing extended versions of marketing videos
- Automating video length optimization
Extensions are generated in segments of 4-8 seconds each. The AI analyzes the last frame of your video and generates a seamless continuation based on your prompt.
Endpoint
POST /v1/project/create/extend-video
Required Fields
string
required
Media ID of the video to extend (as a string)
string
required
Describe how the AI should continue the video (1-2000 characters)Example: “The camera continues to zoom out, revealing a cityscape at sunset with birds flying across the sky”
Optional Fields
string
Custom name for the project (max 100 characters)
number
default:4
Total duration to extend in seconds (4-60 seconds, must be multiple of 4)
- Minimum: 4 seconds
- Maximum: 60 seconds
- Default: 4 seconds
boolean
default:true
Whether to generate audio for the extended portion
string
Webhook URL for status notifications (max 500 characters, must be HTTPS)
object
Custom metadata object (max 5KB JSON)
Request Examples
Basic Video Extension
const response = await fetch('https://api.hooked.so/v1/project/create/extend-video', {
method: 'POST',
headers: {
'x-api-key': process.env.HOOKED_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
media: 'media_video123',
prompt: 'The camera slowly zooms out revealing a beautiful sunset over the ocean',
targetDuration: 8,
generateAudio: true
})
});
const data = await response.json();
console.log('Video ID:', data.data.videoId);
console.log('Project ID:', data.data.projectId);
Extended Duration with Webhook
const extendVideoLonger = async () => {
const response = await fetch('https://api.hooked.so/v1/project/create/extend-video', {
method: 'POST',
headers: {
'x-api-key': process.env.HOOKED_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
media: 'media_marketing_clip',
prompt: 'The product rotates smoothly as the background transitions from blue to purple with subtle particle effects',
targetDuration: 16, // 16 seconds extension
generateAudio: true,
webhook: 'https://yoursite.com/webhook',
metadata: {
campaignId: 'product-launch-2024',
videoType: 'marketing'
}
})
});
return await response.json();
};
Multiple Extensions
const extendVideoMultiple = async () => {
const response = await fetch('https://api.hooked.so/v1/project/create/extend-video', {
method: 'POST',
headers: {
'x-api-key': process.env.HOOKED_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Extended Story Video',
media: 'media_story_video',
prompt: 'The scene continues with smooth camera movement, transitioning through different environments while maintaining visual consistency',
targetDuration: 32, // Will be processed in 4 segments of 8 seconds each
generateAudio: true
})
});
return await response.json();
};
Response
{
"success": true,
"data": {
"videoId": "vid_extend_abc123xyz",
"projectId": "proj_extend_abc123xyz",
"status": "STARTED"
}
}
{
"success": false,
"message": "media: A video is required"
}
{
"success": false,
"message": "extendVideoSettings.targetDuration: Target duration must be at least 4 seconds"
}
{
"success": false,
"message": "extendVideoSettings.prompt: Prompt is required"
}
Webhook Notification
When your extended video is ready, we’ll POST to your webhook URL (if configured):Webhook Payload
{
"status": "COMPLETED",
"data": {
"videoId": "vid_extend_abc123xyz",
"status": "COMPLETED",
"url": "https://cdn.hooked.so/videos/abc123xyz.mp4",
"shareUrl": "https://cdn.hooked.so/shared/abc123xyz.mp4",
"metadata": {
"projectId": "proj_extend_abc123xyz",
"originalDuration": "5s",
"extendedDuration": "13s"
}
},
"message": "Video completed"
}
How It Works
1
Upload Source Video
Provide your source video that you want to extend
2
AI Analysis
Veo 3.1 analyzes the last frame and video motion patterns
3
Generate Extensions
AI generates extension segments (8 seconds each) based on your prompt
4
Seamless Concatenation
All segments are seamlessly concatenated with the source video
5
Final Output
Receive your extended video with smooth transitions
Best Practices
Clear Prompts
Describe the continuation clearly and specifically for best results
Match Style
Reference the visual style of your source video in the prompt
Realistic Durations
Start with 8-16 seconds to ensure quality, then scale up
Audio Consistency
Enable generateAudio for better continuity with the source
Prompt Writing Tips
Good Prompts
✅ “The camera continues to pan right, revealing a mountain range at golden hour with soft clouds drifting across the sky” ✅ “The dancer spins gracefully as the lighting shifts from warm orange to cool blue” ✅ “The product rotates smoothly on the pedestal while particles float upward in the background”Avoid
❌ “Continue the video” (too vague) ❌ “Make it longer” (no direction) ❌ “Add random stuff” (unclear intent)Error Handling
| Error | Description | Solution |
|---|---|---|
media: A video is required | Missing or invalid media ID | Provide a valid video media ID |
Media not found | Media ID doesn’t exist | Check that the media ID is correct and exists |
Media is not a video | Media is not a video type | Ensure the media ID points to a video, not an image |
prompt: Prompt is required | Missing prompt | Provide a descriptive prompt for the extension |
targetDuration: Target duration must be at least 4 seconds | Duration too short | Use minimum 4 seconds |
targetDuration: Target duration cannot exceed 60 seconds | Duration too long | Use maximum 60 seconds |
aspectRatio: Invalid enum value | Invalid aspect ratio | Use ratio_9_16, ratio_16_9, or ratio_1_1 |
Not enough credits | Insufficient credits | Top up your account credits |
Processing Time
Extension processing time varies based on:- Target Duration: Longer extensions take more time (each 8-second segment ~2-3 minutes)
- Audio Generation: Enabling audio adds processing time
- Queue Load: Peak times may have longer waits
- 8 seconds: 2-3 minutes
- 16 seconds: 4-6 minutes
- 32 seconds: 8-12 minutes
- 60 seconds: 15-20 minutes
Next Steps
List Videos
View all your created videos
Video Details
Check your video processing status
Webhooks Guide
Learn how to handle webhook notifications
Examples
See more extend video examples
Authorizations
Body
application/json
Media ID from uploaded video
Describe how the AI should continue the video
Required string length:
1 - 2000Total duration to extend in seconds (must be multiple of 4)
Required range:
4 <= x <= 60Whether to generate audio for the extended portion
Custom name for the project
Maximum string length:
100HTTPS URL for status notifications (max 500 characters)
Maximum string length:
500Custom metadata object (max 5KB)