cURL
curl --request POST \
--url https://api.ttapi.io/grok/extensions \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"video": {
"url": "<string>"
},
"duration": 6,
"model": "grok-imagine-video"
}
'import requests
url = "https://api.ttapi.io/grok/extensions"
payload = {
"prompt": "<string>",
"video": { "url": "<string>" },
"duration": 6,
"model": "grok-imagine-video"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
video: {url: '<string>'},
duration: 6,
model: 'grok-imagine-video'
})
};
fetch('https://api.ttapi.io/grok/extensions', 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.ttapi.io/grok/extensions",
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([
'prompt' => '<string>',
'video' => [
'url' => '<string>'
],
'duration' => 6,
'model' => 'grok-imagine-video'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-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.ttapi.io/grok/extensions"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-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.ttapi.io/grok/extensions")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/grok/extensions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "jobId"
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}Grok
Video Extension
Extend a video by generating continuation content. This is an asynchronous operation that returns a jobId for querying results.
POST
/
grok
/
extensions
cURL
curl --request POST \
--url https://api.ttapi.io/grok/extensions \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"video": {
"url": "<string>"
},
"duration": 6,
"model": "grok-imagine-video"
}
'import requests
url = "https://api.ttapi.io/grok/extensions"
payload = {
"prompt": "<string>",
"video": { "url": "<string>" },
"duration": 6,
"model": "grok-imagine-video"
}
headers = {
"TT-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'TT-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '<string>',
video: {url: '<string>'},
duration: 6,
model: 'grok-imagine-video'
})
};
fetch('https://api.ttapi.io/grok/extensions', 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.ttapi.io/grok/extensions",
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([
'prompt' => '<string>',
'video' => [
'url' => '<string>'
],
'duration' => 6,
'model' => 'grok-imagine-video'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"TT-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.ttapi.io/grok/extensions"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("TT-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.ttapi.io/grok/extensions")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/grok/extensions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["TT-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"<string>\",\n \"video\": {\n \"url\": \"<string>\"\n },\n \"duration\": 6,\n \"model\": \"grok-imagine-video\"\n}"
response = http.request(request)
puts response.read_body{
"status": "SUCCESS",
"message": "success",
"data": {
"jobId": "jobId"
}
}{
"status": "FAILED",
"message": "\"prompt\" cannot be empty.",
"data": {}
}{
"status": "FAILED",
"message": "Wrong TT-API-KEY or email is not activated."
}This is the video extension endpoint of the Grok Video API, which extends a video by generating continuation content.
If you want to see the full API catalog, recommended integration workflow and related capabilities, please read Grok Video API Overview.
Warning: NSFW content is not allowed. A single or occasional moderation failure will not incur any charges. However, repeated moderation failures may result in charges.
Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
application/json
Prompt describing what should happen next in the video.
Video input object. Accepts a public URL, Base64-encoded data URL, or file_id. Maximum input video duration is 15 seconds.
Show child attributes
Show child attributes
Duration of the extension segment to generate in seconds (1-10). Defaults to 6 seconds if not specified.
Required range:
1 <= x <= 10Model to be used.
Available options:
grok-imagine-video Example:
"grok-imagine-video"
Last modified on September 2, 2026