curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "The scene comes alive with gentle wind and drifting clouds",
"first_image_url": "https://example.com/first-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Create a smooth transition from the first frame to the last frame.",
"first_image_url": "https://example.com/first-frame.jpg",
"last_image_url": "https://example.com/last-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Use the first image as the character reference and the second image as the visual style reference. Create a cozy cafe conversation scene.",
"images": [
"https://example.com/character.jpg",
"https://example.com/style.jpg"
],
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
import requests
resp = requests.post(
"https://www.token-nova.com/v1/videos",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
},
timeout=120,
)
print(resp.json())
const response = await fetch("https://www.token-nova.com/v1/videos", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "omni-fast",
prompt:
"Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
seconds: "8",
aspect_ratio: "16:9",
resolution: "720p",
}),
});
console.log(await response.json());
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload := map[string]any{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://www.token-nova.com/v1/videos", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.token-nova.com/v1/videos"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$payload = [
'model' => 'omni-fast',
'prompt' => 'Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight',
'seconds' => '8',
'aspect_ratio' => '16:9',
'resolution' => '720p',
];
$ch = curl_init('https://www.token-nova.com/v1/videos');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "queued",
"progress": 0,
"created_at": 1735689600,
"video_url": ""
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "completed",
"progress": 100,
"created_at": 1735689600,
"completed_at": 1735689900,
"video_url": "https://example.com/results/omni-fast.mp4"
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "failed",
"progress": 100,
"error": {
"message": "upstream task failed",
"code": "task_failed"
}
}
{
"error": {
"message": "field model is required",
"type": "invalid_request_error",
"param": "model",
"code": "invalid_request_error"
}
}
{
"error": {
"message": "invalid token",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
{
"error": {
"message": "insufficient quota",
"type": "insufficient_quota",
"code": "insufficient_quota"
}
}
{
"error": {
"message": "rate limit exceeded",
"type": "rate_limit_error",
"code": "rate_limit_exceeded"
}
}
{
"error": {
"message": "internal server error",
"type": "server_error",
"code": "server_error"
}
}
Omni Video
omni-fast Video Generation
Call omni-fast via POST /v1/videos to generate text-to-video, image-to-video, first/last frame, and multi-reference image video.
POST
https://www.token-nova.com
/
v1
/
videos
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "The scene comes alive with gentle wind and drifting clouds",
"first_image_url": "https://example.com/first-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Create a smooth transition from the first frame to the last frame.",
"first_image_url": "https://example.com/first-frame.jpg",
"last_image_url": "https://example.com/last-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Use the first image as the character reference and the second image as the visual style reference. Create a cozy cafe conversation scene.",
"images": [
"https://example.com/character.jpg",
"https://example.com/style.jpg"
],
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
import requests
resp = requests.post(
"https://www.token-nova.com/v1/videos",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
},
timeout=120,
)
print(resp.json())
const response = await fetch("https://www.token-nova.com/v1/videos", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "omni-fast",
prompt:
"Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
seconds: "8",
aspect_ratio: "16:9",
resolution: "720p",
}),
});
console.log(await response.json());
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload := map[string]any{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://www.token-nova.com/v1/videos", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.token-nova.com/v1/videos"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$payload = [
'model' => 'omni-fast',
'prompt' => 'Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight',
'seconds' => '8',
'aspect_ratio' => '16:9',
'resolution' => '720p',
];
$ch = curl_init('https://www.token-nova.com/v1/videos');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "queued",
"progress": 0,
"created_at": 1735689600,
"video_url": ""
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "completed",
"progress": 100,
"created_at": 1735689600,
"completed_at": 1735689900,
"video_url": "https://example.com/results/omni-fast.mp4"
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "failed",
"progress": 100,
"error": {
"message": "upstream task failed",
"code": "task_failed"
}
}
{
"error": {
"message": "field model is required",
"type": "invalid_request_error",
"param": "model",
"code": "invalid_request_error"
}
}
{
"error": {
"message": "invalid token",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
{
"error": {
"message": "insufficient quota",
"type": "insufficient_quota",
"code": "insufficient_quota"
}
}
{
"error": {
"message": "rate limit exceeded",
"type": "rate_limit_error",
"code": "rate_limit_exceeded"
}
}
{
"error": {
"message": "internal server error",
"type": "server_error",
"code": "server_error"
}
}
omni-fast
omni-fast submits asynchronous video tasks with a JSON request body, suitable for text-to-video, first-frame image-to-video, first/last frame, and multi-reference image video.
- Asynchronous processing mode; returns
idortask_idafter submission. - Text-to-video only requires
model,prompt,seconds, and the aspect ratio field. - First-frame image-to-video uses
first_image_url. - First/last frame uses
first_image_urlandlast_image_url. - Multi-reference images use
images, up to 5; for reference video useomni-fast-v2v.
Method and Path
POST /v1/videos
Request Examples
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "The scene comes alive with gentle wind and drifting clouds",
"first_image_url": "https://example.com/first-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Create a smooth transition from the first frame to the last frame.",
"first_image_url": "https://example.com/first-frame.jpg",
"last_image_url": "https://example.com/last-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
curl -X POST https://www.token-nova.com/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "omni-fast",
"prompt": "Use the first image as the character reference and the second image as the visual style reference. Create a cozy cafe conversation scene.",
"images": [
"https://example.com/character.jpg",
"https://example.com/style.jpg"
],
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}'
import requests
resp = requests.post(
"https://www.token-nova.com/v1/videos",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
},
timeout=120,
)
print(resp.json())
const response = await fetch("https://www.token-nova.com/v1/videos", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "omni-fast",
prompt:
"Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
seconds: "8",
aspect_ratio: "16:9",
resolution: "720p",
}),
});
console.log(await response.json());
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
payload := map[string]any{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p",
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://www.token-nova.com/v1/videos", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, _ := io.ReadAll(resp.Body)
fmt.Println(string(respBody))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String json = """
{
"model": "omni-fast",
"prompt": "Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.token-nova.com/v1/videos"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
<?php
$payload = [
'model' => 'omni-fast',
'prompt' => 'Ocean waves gently rolling onto a sandy beach at golden hour, cinematic, warm sunlight',
'seconds' => '8',
'aspect_ratio' => '16:9',
'resolution' => '720p',
];
$ch = curl_init('https://www.token-nova.com/v1/videos');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Response Examples
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "queued",
"progress": 0,
"created_at": 1735689600,
"video_url": ""
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "completed",
"progress": 100,
"created_at": 1735689600,
"completed_at": 1735689900,
"video_url": "https://example.com/results/omni-fast.mp4"
}
{
"id": "video_abc123",
"task_id": "video_abc123",
"object": "video",
"model": "omni-fast",
"status": "failed",
"progress": 100,
"error": {
"message": "upstream task failed",
"code": "task_failed"
}
}
{
"error": {
"message": "field model is required",
"type": "invalid_request_error",
"param": "model",
"code": "invalid_request_error"
}
}
{
"error": {
"message": "invalid token",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
{
"error": {
"message": "insufficient quota",
"type": "insufficient_quota",
"code": "insufficient_quota"
}
}
{
"error": {
"message": "rate limit exceeded",
"type": "rate_limit_error",
"code": "rate_limit_exceeded"
}
}
{
"error": {
"message": "internal server error",
"type": "server_error",
"code": "server_error"
}
}
Authentication
Use Bearer Token authentication:Authorization: Bearer YOUR_API_KEY
Authorization header. JSON requests must also include:
Content-Type: application/json
Body
Fixed value
omni-fast. Example: "omni-fast".Video prompt. Example:
"Ocean waves gently rolling onto a sandy beach at golden hour".Video duration. Recommended as a string; recommended range is
4 to 30 seconds. Example: "8".Aspect ratio. Example values:
"16:9", "9:16".Resolution field. Example values:
"720p", "1080p", "2k", "4k".First frame image. Passing it enters first-frame image-to-video mode. Supports public URL or
data:image/...;base64,.... Example: "https://example.com/first-frame.jpg".Last frame image. Must be used together with
first_image_url. Example: "https://example.com/last-frame.jpg".Multi-reference image list, up to 5. Supports public URL or
data:image/...;base64,.... Example: ["https://example.com/character.jpg"].Response
Video task ID. Can be used later for
GET /v1/videos/{task_id} queries.Compatibility field for the video task ID. Usually the same as
id.Object type, usually
video.The model used for this task, for example
omni-fast.Task status. Common values are
queued, in_progress, completed, failed.Task progress, commonly in the range
0 to 100.The video URL after completion.
The error object returned when a task fails or an API error occurs, usually containing
message and code.Use Cases
Vertical Text-to-Video
{
"model": "omni-fast",
"prompt": "A woman walking through a neon-lit Tokyo street at night, rain reflections, cinematic",
"seconds": "8",
"aspect_ratio": "9:16",
"resolution": "720p"
}
First-Frame Image-to-Video
{
"model": "omni-fast",
"prompt": "The scene comes alive with gentle wind and drifting clouds",
"first_image_url": "https://example.com/first-frame.jpg",
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}
Multi-Reference Image Video
{
"model": "omni-fast",
"prompt": "Use the first image as the character reference and the second image as the visual style reference.",
"images": [
"https://example.com/character.jpg",
"https://example.com/style.jpg"
],
"seconds": "8",
"aspect_ratio": "16:9",
"resolution": "720p"
}
Notes
omni-fastdoes not support thevideo,video_url,input_videoreference-video fields.imagessupports up to 5 images.- Image fields use JSON; multipart is not required.
- It is recommended to poll
GET /v1/videos/{task_id}, and after completion retrieve the generated MP4 from the returnedvideo_url. - Reference-video editing or extension must use
omni-fast-v2v.
Related APIs
⌘I
