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",
"first_frame": "https://example.com/first_frame.jpg",
"last_frame": "https://example.com/last_frame.jpg",
"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",
"first_frame": "https://example.com/first_frame.jpg",
"last_frame": "https://example.com/last_frame.jpg",
"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',
first_frame: 'https://example.com/first_frame.jpg',
last_frame: 'https://example.com/last_frame.jpg',
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',
'first_frame' => 'https://example.com/first_frame.jpg',
'last_frame' => 'https://example.com/last_frame.jpg',
'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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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."
}First & Last Frame to Video
First & last frame to video - Specify both first_frame and last_frame
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",
"first_frame": "https://example.com/first_frame.jpg",
"last_frame": "https://example.com/last_frame.jpg",
"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",
"first_frame": "https://example.com/first_frame.jpg",
"last_frame": "https://example.com/last_frame.jpg",
"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',
first_frame: 'https://example.com/first_frame.jpg',
last_frame: 'https://example.com/last_frame.jpg',
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',
'first_frame' => 'https://example.com/first_frame.jpg',
'last_frame' => 'https://example.com/last_frame.jpg',
'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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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 \"first_frame\": \"https://example.com/first_frame.jpg\",\n \"last_frame\": \"https://example.com/last_frame.jpg\",\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."
}first_frame and last_frame simultaneously. Supported by grok-imagine-video-1.5-fast and grok-imagine-video-1.5. When both frames use the same image, it creates a loop effect.
Authorizations
You can obtain your API key from the TTAPI Dashboard.
Body
First & last frame to video request parameters
Prompt. Supports longer text input.
First frame image URL. Used to strictly specify the first frame of the video.
Last frame image URL. Used to specify the last frame of the video. When first_frame and last_frame use the same image, it creates a loop effect.
Model name.
grok-imagine-video-1.5-fast, 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; 7s and 11s are not supported); grok-imagine-video-1.5 range: 1 to 15.
Output resolution. Available options: 480p, 720p, 1080P. 1080P is only supported by grok-imagine-video-1.5.
480p, 720p, 1080p 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"