Build with Veevid API
Generate AI videos from text or images. One API key, 10 models, full control.
Get Your API Key →Quick Start
1. Get Your API Key
Create an API key at veevid.ai/settings/api-keys. Save it securely — it's only shown once.
mkdir -p ~/.config/veevid
echo "vv_sk_your_key_here" > ~/.config/veevid/api_key2. Get a Quote
Before generating, check the exact credit cost:
curl -X POST https://veevid.ai/api/quote \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "veo3",
"generation_type": "text-to-video",
"video_quality": "standard"
}'Response:
{
"required_credits": 20,
"current_balance": 451,
"sufficient": true
}3. Generate a Video
curl -X POST https://veevid.ai/api/generate-video \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A golden retriever running through sunflowers, cinematic lighting",
"mode": "veo3",
"aspect_ratio": "16:9",
"video_quality": "standard"
}'Response:
{
"generation_id": "vg_abc123",
"status": "processing"
}4. Check Status
curl https://veevid.ai/api/video-generation/vg_abc123/status \
-H "Authorization: Bearer YOUR_API_KEY"When complete:
{
"status": "completed",
"video_url": "https://cdn.veevid.ai/videos/abc123.mp4"
}Typical generation time: 60–180 seconds.
Authentication
All API requests require a Bearer token:
Authorization: Bearer vv_sk_your_key_here- Keys start with
vv_sk_prefix - Create and manage keys at /settings/api-keys
- Each key shares your account's credit balance
- Maximum 5 active keys per account
Security tips
- Never expose your API key in client-side code
- Use environment variables or secure config files
- Rotate keys if you suspect a leak
API Reference
POST /api/quote
Get the exact credit cost before generating. Only billing-relevant params are needed — no prompt or image required.
Request:
{
"mode": "kling-3",
"generation_type": "text-to-video",
"duration": "10",
"video_quality": "1080p",
"model_version": "kling-3-standard",
"generate_audio": true
}Response:
{
"required_credits": 250,
"current_balance": 451,
"sufficient": true
}POST /api/generate-video
Generate a video from text or image.
Common Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Scene description (max 5000 chars) |
mode | string | Yes | Model selector (see Models) |
aspect_ratio | string | No | "16:9", "9:16", "1:1" etc. |
video_quality | string | No | Quality tier (model-specific) |
duration | string | No | Video length in seconds (model-specific) |
generation_type | string | No | "text-to-video" or "image-to-video" |
image | string | No | Single image URL (required for image-to-video) |
images | string[] | No | Multiple image URLs — Kling 3.0: [start, end frame]; Veo 3.1: up to 3 reference images |
model_version | string | No | Sub-variant (e.g. "kling-3-pro") |
Response:
{
"generation_id": "vg_abc123",
"status": "processing",
"video_url": null
}Some models return "status": "completed" with a video_url immediately.
GET /api/video-generation/{generation_id}/status
Poll for generation completion.
Response (processing):
{
"status": "processing"
}Response (completed):
{
"status": "completed",
"video_url": "https://cdn.veevid.ai/videos/abc123.mp4"
}Status values: processing → completed or failed
GET /api/credits
Check your current credit balance.
{
"success": true,
"credits": 451,
"balance": 451
}Models
Video Models
| Model | mode | Duration | Audio | Key Strengths | Credits |
|---|---|---|---|---|---|
| Veo 3.1 | veo3 | 8s | ✅ Native | Budget-friendly, fast | 20–140 credits |
| Grok Imagine | grok-imagine | 6/10/15s | ✅ Native | Fastest generation | 10–60 credits |
| Veevid 1.0 Pro | veevid-1.0-pro | 4–12s | ✅ | Audio-visual sync | 12–288 credits |
| Seedance 1.5 Pro | seedance-1.5-pro | 4–12s | ✅ | Wide aspect ratios | 12–288 credits |
| Kling 3.0 | kling-3 | 3–15s | ✅ | Multi-shot, text rendering | 48–495 credits |
| LTX 2.3 | ltx-2-3 | 6–20s | ✅ | Up to 4K (2160p) | 48–960 credits |
| Kling 2.6 | kling-2-6 | 5–10s | ✅ | Cinematic, multi-shot | 70–280 credits |
| Sora 2 Stable | sora2-stable | 4–20s | ✅ Native | Best prompt accuracy | 80–2000 credits |
| Sora 2 | sora2 | 10–25s | ✅ Native | Longest clips, storyboard | 20–315 credits |
| Wan 2.6 | wan-2-6 | 5–15s | ✅ | Video-to-video, multi-shot | 100–450 credits |
Credits vary by duration, resolution, and quality. Use /api/quote for exact pricing.
Generation Types
| Type | Description | Supported Models |
|---|---|---|
text-to-video | Generate from text prompt | All models |
image-to-video | Animate an image | All models |
reference-to-video | Use reference image for style | Veo 3.1 |
video-to-video | Transform existing video | Wan 2.6 |
Each model has unique allowed values for duration, aspect ratio, and quality. Use /api/quote to validate parameters.
Code Examples
Python
import requests
import time
API_KEY = "vv_sk_your_key_here"
BASE = "https://veevid.ai/api"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# 1. Quote
quote = requests.post(f"{BASE}/quote", headers=HEADERS, json={
"mode": "veo3",
"generation_type": "text-to-video",
"video_quality": "standard"
}).json()
print(f"Cost: {quote['required_credits']} credits")
# 2. Generate
result = requests.post(f"{BASE}/generate-video", headers=HEADERS, json={
"prompt": "A chef cooking in a modern kitchen, cinematic",
"mode": "veo3",
"video_quality": "standard"
}).json()
gen_id = result["generation_id"]
# 3. Poll
while True:
status = requests.get(
f"{BASE}/video-generation/{gen_id}/status",
headers=HEADERS
).json()
if status["status"] == "completed":
print(f"Video ready: {status['video_url']}")
break
elif status["status"] == "failed":
print("Generation failed")
break
time.sleep(10)JavaScript / TypeScript
const API_KEY = "vv_sk_your_key_here";
const BASE = "https://veevid.ai/api";
async function generateVideo(prompt: string) {
// 1. Quote
const quote = await fetch(`${BASE}/quote`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
mode: "veo3",
generation_type: "text-to-video",
video_quality: "standard",
}),
}).then((r) => r.json());
console.log(`Cost: ${quote.required_credits} credits`);
// 2. Generate
const result = await fetch(`${BASE}/generate-video`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ prompt, mode: "veo3", video_quality: "standard" }),
}).then((r) => r.json());
// 3. Poll
while (true) {
const status = await fetch(
`${BASE}/video-generation/${result.generation_id}/status`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
).then((r) => r.json());
if (status.status === "completed") return status.video_url;
if (status.status === "failed") throw new Error("Generation failed");
await new Promise((r) => setTimeout(r, 10000));
}
}OpenClaw Agent
Install the Veevid skill:
npx clawhub@latest install veevidThen tell your agent: "Generate a 10-second product video with Kling 3.0"
The agent handles quoting, confirmation, generation, and polling automatically.
Error Codes
| Code | Meaning | What to Do |
|---|---|---|
| 400 | Invalid parameters | Check allowed values for the model |
| 401 | Invalid or missing API key | Verify your key at /settings/api-keys |
| 402 | Insufficient credits | Top up at /pricing |
| 403 | Account suspended | Contact support |
| 404 | Generation not found | Check the generation_id |
| 429 | Rate limit exceeded | Wait and retry |
| 500 | Server error | Wait a few seconds and retry |
Error response format:
{
"error": "Insufficient credits",
"required": 140,
"balance": 12
}Rate Limits
| Limit | Value |
|---|---|
| Requests per key per minute | 30 |
| Requests per account per hour | 200 |
| Concurrent generations | 3 |
| API keys per account | 5 |