curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "happyhorse-1.0-text-to-video",
prompt: "a horse galloping on a beach at sunset, cinematic lighting",
image_url: "https://example.com/input.png",
duration: 4,
resolution: "1080p"
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_xyz789",
"object": "video.generation",
"model": "happyhorse-1.0-text-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_happy_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
HappyHorse Series
HappyHorse 1.0 Text To Video
HappyHorse’s top-ranked video generation model supporting 720p and 1080p outputs with per-second billing via Vibetool’s async API.
POST
/
v1
/
videos
/
generations
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "happyhorse-1.0-text-to-video",
prompt: "a horse galloping on a beach at sunset, cinematic lighting",
image_url: "https://example.com/input.png",
duration: 4,
resolution: "1080p"
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_xyz789",
"object": "video.generation",
"model": "happyhorse-1.0-text-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_happy_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
Pricing: See vibetool.ai/pricing for current rates.
Input Modalities
- Text – a descriptive prompt for the video content.
- Image – (optional) a still image to guide the generation (e.g., style, character, background).
Output Modality
- Video – an MP4 file at 720p or 1080p resolution (duration varies per request and model configuration).
Authorization
string
required
All APIs require Bearer Token authentication. Format:
Bearer YOUR_API_KEYRequest Body
string
required
The model identifier. Use
"happyhorse-1.0-text-to-video".string
required
Text description of the desired video (e.g., “a horse galloping on a beach at sunset, cinematic lighting, 4K quality”).
string
A publicly accessible URL to an input image (JPEG or PNG) that helps guide the video generation. The image should be at least 256x256 pixels and no larger than 2048x2048.
number
Requested video duration in seconds (default is model‑specific, maximum depends on the plan). The model may adjust the duration to match its capabilities.
string
Desired output resolution. Options:
"720p" or "1080p". Defaults to "720p".Response Schema
string
required
Unique identifier for the generation task.
string
required
Type of object, always
"video.generation".string
required
The model used, e.g.,
"happyhorse-1.0-text-to-video".integer
required
Unix timestamp (seconds) of task creation.
string
required
Initial status:
"pending" or "processing". Use the Get Video Status endpoint to poll for completion.string
required
The task ID to query in the status endpoint.
curl -X POST https://api.vibetool.ai/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}'
import requests
url = "https://api.vibetool.ai/v1/videos/generations"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p"
}
r = requests.post(url, json=payload, headers=headers, timeout=60)
print(r.status_code, r.json())
const response = await fetch("https://api.vibetool.ai/v1/videos/generations", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "happyhorse-1.0-text-to-video",
prompt: "a horse galloping on a beach at sunset, cinematic lighting",
image_url: "https://example.com/input.png",
duration: 4,
resolution: "1080p"
})
});
const data = await response.json();
console.log(data);
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
payload := map[string]interface{}{
"model": "happyhorse-1.0-text-to-video",
"prompt": "a horse galloping on a beach at sunset, cinematic lighting",
"image_url": "https://example.com/input.png",
"duration": 4,
"resolution": "1080p",
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.vibetool.ai/v1/videos/generations", bytes.NewReader(b))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
{
"id": "gen_vid_xyz789",
"object": "video.generation",
"model": "happyhorse-1.0-text-to-video",
"created_at": 1767072426,
"status": "pending",
"task_id": "vid_202512261557_happy_b4fcbb08"
}
{
"error": {
"message": "Invalid image URL or unsupported image format.",
"type": "invalid_request_error",
"param": "image_url",
"code": 400
}
}
task_id until the status becomes "completed", at which point the video URL will be available in the response.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Was this page helpful?