Quick Start
3 steps to generate your first AI video.
Get your API key
Log in with Telegram to get your vgen-xxxx API key and your first credits.
Make requests
Use Authorization: Bearer YOUR_KEY header with any endpoint below.
Poll for results
Video generation is async — submit a job, then poll the status endpoint until done.
Auth & Credits
| Header | Value |
|---|---|
| Authorization | Bearer vgen-your-api-key |
| Content-Type | application/json |
Check Credit Balance
# Check your wallet balance
curl "https://vgen.abhibots.com/api/v1/balance" \
-H "Authorization: Bearer YOUR_KEY"
# Response
# {
# "balance": 3085, # credits — the unit everything is priced in
# "credits": 3085,
# "balance_usd": 12.34, # same money in dollars, for reference
# "credits_per_usd": 200,
# "currency": "credits"
# }MCP — use vgen from Claude or ChatGPT
Connect once and generate by asking, instead of writing requests. Same models, same credit prices, same wallet.
Connect
The server lives at https://vgen.abhibots.com/mcp and authenticates with your normal API key — no separate login, and nothing to install.
# Claude Code — one command
claude mcp add --transport http vgen https://vgen.abhibots.com/mcp \
--header "Authorization: Bearer vgen-your-api-key"
# Then just ask:
# "make me a video of a cat surfing, 6 seconds"
# "how many credits do I have left?"For any client that takes a JSON config (Claude Desktop, ChatGPT, Cursor, Windsurf):
{
"mcpServers": {
"vgen": {
"type": "http",
"url": "https://vgen.abhibots.com/mcp",
"headers": {
"Authorization": "Bearer vgen-your-api-key"
}
}
}
}What it can do
list_modelsEvery working model with its price in creditsget_balanceYour remaining creditsgenerate_imageText-to-image, or an edit when you pass reference imagesgenerate_videoText-to-video, or animate a stillcheck_statusFinish a long render — free, polling is never chargedcheck_status to collect it.Endpoints
Video Generation
Status Pollingfree
File Upload
Runway Gen-4
Billed per second — 3 credits/s (5s = 15 credits, 10s = 30). Quality and duration required.
curl -X POST https://vgen.abhibots.com/api/v1/runway/generate \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Cinematic drone shot over mountains at sunrise",
"quality": "720p",
"duration": "5"
}'
# quality: "720p" | "1080p" (required)
# duration: "5" | "8" | "10"Seedance 1.5 Pro
ByteDance model via /jobs endpoint. Billing: 3.5 credits/s — 5s = 17.5 credits, 10s = 35.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-1.5-pro",
"input": {
"prompt": "A cat playing piano, smooth motion",
"duration": "5",
"aspect_ratio": "16:9"
}
}'
# duration: "4" | "5" | "8" | "10" | "12" (string)Grok Image-to-Video
xAI Grok image-to-video. Billing: 2.4 credits/s — 6s = 14.4 credits, 15s = 36.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine/image-to-video",
"input": {
"prompt": "the subject walks forward, cinematic motion",
"image_url": "https://example.com/photo.jpg",
"duration": "6"
}
}'
# image_url: required — the reference image to animate
# duration: "6" | "10" | "15"Kling 3.0
Kuaishou Kling 3.0. Text-to-video and image-to-video. Billing: 14 credits/s — 5s = 70 credits, 10s = 140.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-3.0/video",
"input": {
"prompt": "A serene mountain lake at dawn, mist rising",
"duration": "5",
"aspect_ratio": "16:9"
}
}'
# duration: "5" | "10"
# add image_url to input for image-to-video⭐ Seedance 2.5
ByteDance's newest model — text-to-video, image-to-video (first/last frame) and multimodal reference-to-video with native audio. Billed per second in credits, price follows resolution.
Pricing (per-resolution)
Text → Video
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2-5",
"input": {
"prompt": "A serene beach at sunset, waves crashing, cinematic",
"duration": "5",
"resolution": "720p",
"aspect_ratio": "16:9",
"generate_audio": true
}
}'
# duration: 4-10s · resolution: "480p" | "720p" | "1080p" (no 4K)
# aspect_ratio: 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9 · adaptive
# generate_audio: true adds a soundtrack (costs no extra credits on vgen)
# output_format: "mp4" (default) | "mov" · web_search: true enables online searchImage → Video (first / last frame)
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2-5",
"input": {
"prompt": "the subject smiles and waves, gentle cinematic motion",
"first_frame_url": "https://example.com/photo.jpg",
"last_frame_url": "https://example.com/end.jpg",
"duration": "5",
"resolution": "720p",
"aspect_ratio": "adaptive",
"generate_audio": true
}
}'
# IMPORTANT: first/last-frame tasks ONLY accept aspect_ratio "adaptive"
# (anything else is a 422). Output aspect follows the input image.
# last_frame_url is optional and requires first_frame_url.
# Upload local images first via POST /api/v1/upload (multipart "file") -> { url }Multimodal Reference → Video
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2-5",
"input": {
"prompt": "@Image1 dancing in the rain, @Audio1 as soundtrack",
"reference_image_urls": ["https://example.com/ref1.jpg"],
"reference_video_urls": ["https://example.com/ref.mp4"],
"reference_audio_urls": ["https://example.com/ref.mp3"],
"duration": "5",
"resolution": "720p",
"aspect_ratio": "16:9"
}
}'
# Reference tokens in prompt: @Image1... @Video1... @Audio1...
# reference_image_urls: up to 9 (jpeg/png/webp/bmp/tiff/gif, <30MB each)
# reference_video_urls: mp4/mov, 480p/720p, 2-30s each (total <=30s)
# reference_audio_urls: wav/mp3, 2-30s each, <15MB
# MUTUALLY EXCLUSIVE with first_frame_url / last_frame_url — pick ONE mode.Seedance 2.0 — Reference-to-Video
Text-to-video, image-to-video (first/last frame) and reference-to-video (9 images / 3 videos / 3 audio). Billed per second, price follows resolution — see the live picker for current rates.
Text-to-Video
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2",
"input": {
"prompt": "A cinematic shot of a futuristic city",
"duration": "5",
"aspect_ratio": "16:9"
}
}'
# duration: "4" | "5" | "8" | "10" (string)
# resolution: "480p" | "720p" | "1080p" (price follows resolution)Reference-to-Video (images + videos + audio)
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2",
"input": {
"prompt": "@Image1 walking through a garden, cinematic",
"reference_image_urls": ["https://example.com/ref1.jpg"],
"duration": "5",
"aspect_ratio": "16:9"
}
}'
# Reference tokens: @Image1, @Image2... @Video1... @Audio1...
# reference_image_urls: max 9 images (jpeg/png/webp, 30MB each)
# reference_video_urls: max 3 videos (combined ≤15s)
# reference_audio_urls: max 3 audio (combined ≤15s)
# For image-to-video use first_frame_url (+ optional last_frame_url)
# with aspect_ratio "adaptive" — same contract as Seedance 2.5 above.@Image1, @Video1, @Audio1 in your prompt to reference uploaded assets by position. Both image_urls and reference_image_urls field names are accepted.Hailuo Text-to-Video
MiniMax Hailuo. Billing: 5 credits/s — a 6s clip is 30 credits. I2V variant also available.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "hailuo/02-text-to-video-standard",
"input": {
"prompt": "Timelapse of a sunset over the ocean",
"duration": "6",
"aspect_ratio": "16:9"
}
}'
# T2V model: "hailuo/02-text-to-video-standard"
# I2V model: "hailuo/2-3-image-to-video-standard" (add image_url to input)
# duration: "6" (string, required)Grok Video
xAI Grok video model. Billed per second by resolution — 480p 2.4 credits/s · 720p 4.5 credits/s (I2V adds 1080p at 8 credits/s).
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-imagine-video-1-5-preview",
"input": {
"prompt": "A futuristic city at night, neon lights",
"duration": "6"
}
}'
# duration: "6" | "10" | "15"
# resolution: "480p" | "720p" — price follows resolution.Kling 2.6
Kuaishou Kling model. T2V and I2V. Billing: 11 credits/s — 5s = 55 credits, 10s = 110.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kling-2.6/text-to-video",
"input": {
"prompt": "Calm ocean waves on a sandy beach",
"sound": false,
"duration": "5",
"aspect_ratio": "16:9"
}
}'
# T2V model: "kling-2.6/text-to-video"
# I2V model: "kling-2.6/image-to-video" (add image_url to input)
# sound: true | false (required — enable audio generation)
# duration: "5" | "10"NanoBanana — Image Generation
Google NanoBanana image model. Output: 1344×768 PNG. Billing: flat 4 credits per image.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/nano-banana",
"input": {
"prompt": "A futuristic city at sunset, digital art"
}
}'
# T2I model: "google/nano-banana"
# Edit model: "google/nano-banana-edit" (add image_urls: ["https://..."])Adobe Firefly — Image Generation
Text-to-image via Adobe Firefly. Synchronous — polls the /jobs/recordInfo endpoint. Currently free (0 credits per image).
# Adobe Firefly — synchronous, returns the image URL directly (no polling).
# Currently FREE: 0 credits per image.
curl -X POST https://vgen.abhibots.com/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "firefly",
"input": {
"prompt": "a serene mountain lake at sunrise, cinematic, 4k"
}
}'
# Poll GET /api/v1/jobs/recordInfo?taskId=ID until state==="success"
# Result URL: data.resultJson.resultImageUrlFor image editing, use google/nano-banana-edit (4 credits each) — pass image_urls: ["https://..."] in the input. See the NanoBanana section.
Status & Error Codes
You are only charged on a successful 200 response — any error or rejection costs nothing.
200 Success — result returned (charged)
400 Content rejected by safety system (adult/sexual/violent)
e.g. safety_violations=[sexual] — NOT charged
401 Invalid or missing API key
402 Insufficient credits
404 Task not found (unknown taskId on recordInfo)
422 Validation error (prompt too short, bad params) — NOT charged
500 Upstream generation error — NOT charged
502 Backend unreachable — NOT charged
503 Backend not configured
# Billing rule: you are charged ONLY on a 200 success.
# Every error/rejection costs 0 credits. Async video jobs that
# fail or stall after submission are auto-refunded.Poll for Results
All generation is async. Poll at 3–5s intervals until the job completes. Polling is always free.
# Veo 3
curl "https://vgen.abhibots.com/api/v1/veo/record-info?taskId=TASK_ID" \
-H "Authorization: Bearer YOUR_KEY"
# Runway
curl "https://vgen.abhibots.com/api/v1/runway/record-detail?taskId=TASK_ID" \
-H "Authorization: Bearer YOUR_KEY"
# All others (Seedance, Hailuo, Grok, Kling, NanoBanana)
curl "https://vgen.abhibots.com/api/v1/jobs/recordInfo?taskId=TASK_ID" \
-H "Authorization: Bearer YOUR_KEY"
# Response: data.state === "success" → done
# Video URL: data.resultJson.resultUrls[0]
# Image URL: data.resultJson.resultImageUrlPython Example
End-to-end: submit Grok job, poll until done, print result URL.
import requests, time, json
BASE = "https://vgen.abhibots.com"
KEY = "YOUR_KEY"
H = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
# Submit job (Grok 10s)
resp = requests.post(f"{BASE}/api/v1/jobs/createTask", headers=H, json={
"model": "grok-imagine-video-1-5-preview",
"input": {"prompt": "A rocket launching into space", "duration": "10"}
}).json()
task_id = resp["data"]["taskId"]
print(f"Job submitted: {task_id}")
# Poll until done
while True:
r = requests.get(f"{BASE}/api/v1/jobs/recordInfo",
headers=H, params={"taskId": task_id}).json()
state = r.get("data", {}).get("state")
if state == "success":
result = r["data"]["resultJson"]
urls = result.get("resultUrls") or [result.get("resultImageUrl")]
print("Result:", urls[0])
break
elif state == "failed":
print("Job failed:", r)
break
print(f"State: {state} — waiting...")
time.sleep(5)