curl --request POST \
--url https://api.ttapi.io/grok/generations \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"model": "grok-imagine-video-1.5-fast",
"aspect_ratio": "16:9",
"video_length": "10",
"resolution_name": "720p",
"refer_images": [
"<string>"
],
"reference_audios": [
{
"voice_id": "sirius"
},
{
"voice_id": "carina"
},
{
"voice_id": "leo"
}
],
"hook_url": "https://example.com/callback"
}
'import requests
url = "https://api.ttapi.io/grok/generations"
payload = {
"prompt": "<string>",
"model": "grok-imagine-video-1.5-fast",
"aspect_ratio": "16:9",
"video_length": "10",
"resolution_name": "720p",
"refer_images": ["<string>"],
"reference_audios": [{ "voice_id": "sirius" }, { "voice_id": "carina" }, { "voice_id": "leo" }],
"hook_url": "https://example.com/callback"
}
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>',
model: 'grok-imagine-video-1.5-fast',
aspect_ratio: '16:9',
video_length: '10',
resolution_name: '720p',
refer_images: ['<string>'],
reference_audios: [{voice_id: 'sirius'}, {voice_id: 'carina'}, {voice_id: 'leo'}],
hook_url: 'https://example.com/callback'
})
};
fetch('https://api.ttapi.io/grok/generations', 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/generations",
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>',
'model' => 'grok-imagine-video-1.5-fast',
'aspect_ratio' => '16:9',
'video_length' => '10',
'resolution_name' => '720p',
'refer_images' => [
'<string>'
],
'reference_audios' => [
[
'voice_id' => 'sirius'
],
[
'voice_id' => 'carina'
],
[
'voice_id' => 'leo'
]
],
'hook_url' => 'https://example.com/callback'
]),
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/generations"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\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/generations")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/grok/generations")
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 \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\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."
}Reference to Video
Reference to video - Generate videos using refer_images and reference_audios
curl --request POST \
--url https://api.ttapi.io/grok/generations \
--header 'Content-Type: application/json' \
--header 'TT-API-KEY: <api-key>' \
--data '
{
"prompt": "<string>",
"model": "grok-imagine-video-1.5-fast",
"aspect_ratio": "16:9",
"video_length": "10",
"resolution_name": "720p",
"refer_images": [
"<string>"
],
"reference_audios": [
{
"voice_id": "sirius"
},
{
"voice_id": "carina"
},
{
"voice_id": "leo"
}
],
"hook_url": "https://example.com/callback"
}
'import requests
url = "https://api.ttapi.io/grok/generations"
payload = {
"prompt": "<string>",
"model": "grok-imagine-video-1.5-fast",
"aspect_ratio": "16:9",
"video_length": "10",
"resolution_name": "720p",
"refer_images": ["<string>"],
"reference_audios": [{ "voice_id": "sirius" }, { "voice_id": "carina" }, { "voice_id": "leo" }],
"hook_url": "https://example.com/callback"
}
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>',
model: 'grok-imagine-video-1.5-fast',
aspect_ratio: '16:9',
video_length: '10',
resolution_name: '720p',
refer_images: ['<string>'],
reference_audios: [{voice_id: 'sirius'}, {voice_id: 'carina'}, {voice_id: 'leo'}],
hook_url: 'https://example.com/callback'
})
};
fetch('https://api.ttapi.io/grok/generations', 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/generations",
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>',
'model' => 'grok-imagine-video-1.5-fast',
'aspect_ratio' => '16:9',
'video_length' => '10',
'resolution_name' => '720p',
'refer_images' => [
'<string>'
],
'reference_audios' => [
[
'voice_id' => 'sirius'
],
[
'voice_id' => 'carina'
],
[
'voice_id' => 'leo'
]
],
'hook_url' => 'https://example.com/callback'
]),
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/generations"
payload := strings.NewReader("{\n \"prompt\": \"<string>\",\n \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\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/generations")
.header("TT-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"<string>\",\n \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ttapi.io/grok/generations")
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 \"model\": \"grok-imagine-video-1.5-fast\",\n \"aspect_ratio\": \"16:9\",\n \"video_length\": \"10\",\n \"resolution_name\": \"720p\",\n \"refer_images\": [\n \"<string>\"\n ],\n \"reference_audios\": [\n {\n \"voice_id\": \"sirius\"\n },\n {\n \"voice_id\": \"carina\"\n },\n {\n \"voice_id\": \"leo\"\n }\n ],\n \"hook_url\": \"https://example.com/callback\"\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."
}refer_images for reference images or reference_audios for voice characters, combined with prompt to generate videos.
Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
Reference to video request parameters
Prompt. Maximum length is 4096 characters for grok-imagine-video and grok-imagine-video-1.5; grok-imagine-video-1.5-fast supports longer prompts.
Model name.
grok-imagine-video-1.5-fast: duration 6-30s (6s and 10s are standard durations; 7s and 11s are not supported); supports multiple reference images (max 7); supports first/last frame controlgrok-imagine-video: duration 1-15s, supports multiple reference images (single image up to 15s, multiple images max 10s), 720P onlygrok-imagine-video-1.5: duration 1-15s, only single reference image and it is required
grok-imagine-video-1.5-fast, grok-imagine-video, grok-imagine-video-1.5 "grok-imagine-video-1.5-fast"
Video aspect ratio
2:3, 3:2, 1:1, 9:16, 16:9 Video duration in seconds. grok-imagine-video-1.5-fast range: 6 to 30 (6s and 10s are standard durations); grok-imagine-video range: 1 to 15 (single image up to 15s, multiple images max 10s); grok-imagine-video-1.5 range: 1 to 15.
Output resolution. 480p and 720p are supported by all models; 1080p is only supported by grok-imagine-video-1.5.
480p, 720p, 1080p Reference image URLs. grok-imagine-video-1.5-fast supports multiple images (max 7); grok-imagine-video supports multiple images (single image up to 15s, multiple images max 10s); grok-imagine-video-1.5 only supports a single image and it is required.['https://cdn.ttapi.io/other/2026-03-13/a86ca2c7-6333-4840-b337-395a5d02a182.png','https://cdn.ttapi.io/other/2026-03-13/64a858ed-6095-45ce-92d5-b515c9864703.png']
Array of voice characters, up to 3 entries. Example: [{"voice_id": "sirius"}]
3Show child attributes
Show child attributes
[
{ "voice_id": "sirius" },
{ "voice_id": "carina" },
{ "voice_id": "leo" }
]
Callback URL address. When the task completes or fails, notifications will be sent to this address. The notification data structure is consistent with the fetch structure [blocked]. If not set, you need to call the fetch endpoint [blocked] to query the result
"https://example.com/callback"