curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "grok-imagine-image-to-video-beta",
"prompt": "The person starts dancing",
"image_urls": [
"https://example.com/image.jpg"
],
"duration": 6,
"mode": "normal",
"quality": "480p"
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "grok-imagine-image-to-video-beta",
"prompt": "The person starts dancing",
"image_urls": ["https://example.com/image.jpg"],
"duration": 6,
"mode": "normal",
"quality": "480p"
}
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: 'grok-imagine-image-to-video-beta',
prompt: 'The person starts dancing',
image_urls: ['https://example.com/image.jpg'],
duration: 6,
mode: 'normal',
quality: '480p'
})
};
fetch('https://api.evolink.ai/v1/videos/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.evolink.ai/v1/videos/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([
'model' => 'grok-imagine-image-to-video-beta',
'prompt' => 'The person starts dancing',
'image_urls' => [
'https://example.com/image.jpg'
],
'duration' => 6,
'mode' => 'normal',
'quality' => '480p'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "grok-imagine-image-to-video-beta",
"object": "video.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": true,
"estimated_time": 120
},
"type": "video",
"usage": {
"billing_rule": "per_call",
"credits_reserved": 4.8,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: grok-imagine-image-to-video-beta",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Grok Imagine Image to Video Beta
- Grok Imagine (grok-imagine-image-to-video-beta) model supports image-to-video mode
- Asynchronous processing mode, use the returned task ID to query
- Generated video links are valid for 24 hours, please save them promptly
curl --request POST \
--url https://api.evolink.ai/v1/videos/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "grok-imagine-image-to-video-beta",
"prompt": "The person starts dancing",
"image_urls": [
"https://example.com/image.jpg"
],
"duration": 6,
"mode": "normal",
"quality": "480p"
}
'import requests
url = "https://api.evolink.ai/v1/videos/generations"
payload = {
"model": "grok-imagine-image-to-video-beta",
"prompt": "The person starts dancing",
"image_urls": ["https://example.com/image.jpg"],
"duration": 6,
"mode": "normal",
"quality": "480p"
}
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: 'grok-imagine-image-to-video-beta',
prompt: 'The person starts dancing',
image_urls: ['https://example.com/image.jpg'],
duration: 6,
mode: 'normal',
quality: '480p'
})
};
fetch('https://api.evolink.ai/v1/videos/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.evolink.ai/v1/videos/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([
'model' => 'grok-imagine-image-to-video-beta',
'prompt' => 'The person starts dancing',
'image_urls' => [
'https://example.com/image.jpg'
],
'duration' => 6,
'mode' => 'normal',
'quality' => '480p'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.evolink.ai/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.evolink.ai/v1/videos/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"grok-imagine-image-to-video-beta\",\n \"prompt\": \"The person starts dancing\",\n \"image_urls\": [\n \"https://example.com/image.jpg\"\n ],\n \"duration\": 6,\n \"mode\": \"normal\",\n \"quality\": \"480p\"\n}"
response = http.request(request)
puts response.read_body{
"created": 1757169743,
"id": "task-unified-1757169743-7cvnl5zw",
"model": "grok-imagine-image-to-video-beta",
"object": "video.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": true,
"estimated_time": 120
},
"type": "video",
"usage": {
"billing_rule": "per_call",
"credits_reserved": 4.8,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: grok-imagine-image-to-video-beta",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Authorizations
##All APIs require Bearer Token authentication##
Get API Key:
Visit API Key Management Page to get your API Key
Add to request header:
Authorization: Bearer YOUR_API_KEY
Body
Model name
Backward Compatible: The previously integrated model name grok-imagine-image-to-video is still supported and will be automatically mapped to grok-imagine-image-to-video-beta
grok-imagine-image-to-video-beta "grok-imagine-image-to-video-beta"
Video description prompt
"The person starts dancing"
Reference image URL list
Requirements:
- Supports
1~7images per request - Image size: max
10MB - Supported formats: JPEG, PNG, WebP
1 - 7 elements["https://example.com/image.jpg"]
Video duration (seconds), any integer between 6 and 30 seconds
6 <= x <= 306
Generation style
Options:
fun: Fun stylenormal: Normal style (default)spicy: Spicy style
fun, normal, spicy "normal"
Aspect ratio (only effective in multi-image mode; in single-image mode, video size follows the input image)
Options:
16:9: Landscape (default)9:16: Portrait1:1: Square3:2: Landscape 3:22:3: Portrait 2:3
16:9, 9:16, 1:1, 3:2, 2:3 "16:9"
Video resolution, default is 480p
Options:
480p: Standard definition (default)720p: High definition
480p, 720p "480p"
HTTPS callback URL after task completion
Callback Timing:
- Triggered when task is completed, failed, or cancelled
- Sent after billing confirmation
Security Restrictions:
- Only HTTPS protocol supported
- Callback to internal IPs prohibited (127.0.0.1, 10.x.x.x, 172.16-31.x.x, 192.168.x.x, etc.)
- URL length must not exceed
2048characters
Callback Mechanism:
- Timeout:
10seconds - Max
3retries on failure (after1/2/4seconds) - Response format matches task query API
- 2xx status code = success, others trigger retry
"https://your-domain.com/webhooks/video-task-completed"
Response
Video task created successfully
Task creation timestamp
1757169743
Task ID
"task-unified-1757169743-7cvnl5zw"
Actual model name used
"grok-imagine-image-to-video-beta"
Specific task type
video.generation.task Task progress percentage (0-100)
0 <= x <= 1000
Task status
pending, processing, completed, failed "pending"
Video task detailed information
Show child attributes
Show child attributes
Task output type
text, image, audio, video "video"
Usage and billing information
Show child attributes
Show child attributes