Quick Start

3 steps to generate your first AI video.

1

Get your API key

Log in with Telegram to get your vgen-xxxx API key and your first credits.

2

Make requests

Use Authorization: Bearer YOUR_KEY header with any endpoint below.

3

Poll for results

Video generation is async — submit a job, then poll the status endpoint until done.

Auth & Credits

HeaderValue
AuthorizationBearer vgen-your-api-key
Content-Typeapplication/json
Everything is priced in credits — $1 buys 200. Credits are deducted per request; per-second models multiply rate × duration. If a generation errors or fails, the credits are automatically refunded. Polling endpoints are always free.

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 credits
get_balanceYour remaining credits
generate_imageText-to-image, or an edit when you pass reference images
generate_videoText-to-video, or animate a still
check_statusFinish a long render — free, polling is never charged
Billing is identical to the API — credits come off the same wallet, and only on success. A video that takes more than a couple of minutes returns a task id instead of making you wait; your assistant will call check_status to collect it.

Endpoints

Video Generation

POST/api/v1/jobs/createTaskSeedance 2.5/2.0/1.5 · Kling 3.0/2.6 · Hailuo · Grok · NanoBanana
POST/api/v1/runway/generateRunway Gen-4

Status Pollingfree

GET/api/v1/jobs/recordInfo?taskId=IDJobs status (createTask models)
GET/api/v1/runway/record-detail?taskId=IDRunway status

File Upload

POST/upload/file-base64-uploadUpload image (base64)
POST/upload/file-stream-uploadUpload image (multipart)

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)

480p28 cr / second5s video = 140 cr
720p63 cr / second5s video = 315 cr
1080p114 cr / second5s video = 570 cr

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 search

Image → 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.
Tip: Use @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.resultImageUrl

For 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.resultImageUrl

Python 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)