Yes. HopBase puts several video model families behind one asynchronous task API: Seedance (2.0 and 2.5), Kling (including 4.0), MiniMax Hailuo (H3 and H3-Max) and Grok Imagine video all submit with POST /v1/video/generate and poll with GET /v1/video/tasks/{task_id}. Alibaba Wan 3.0 and HappyHorse 1.1 keep their official paths (POST /api/v1/services/aigc/video-generation/video-synthesis, polled at GET /api/v1/tasks/{task_id}). One key can include up to 10 groups, so a single key and a single USD balance can cover every family. What is shared is the submit, poll and download loop, the account and the balance; each request body still follows its family's own fields. Failed video tasks are not billed, and result links are valid for 24 hours after the task completes.
What is unified and what is not
Start with each family's minimum request and where the result appears. This table is what your polling code has to absorb:
| Family | Submit / poll | Minimum request | Submit returns | Read when complete |
|---|---|---|---|---|
| Seedance | /v1/video/generate / /v1/video/tasks/{task_id} | model + non-empty content[] | 200, task.id (vt…) | task.outputs |
| Grok Imagine video | Same | model + prompt or content + resolution | 200, task.id (vt…) | task.outputs |
| MiniMax Hailuo | Same | model + content + resolution + duration (text-only also needs ratio) | 202, id (mmt…) | outputs |
| Kling | Same | model + prompt or images[] / videos[] | 202, id (kt…) | outputs |
| Wan 3.0 / HappyHorse 1.1 | /api/v1/services/aigc/video-generation/video-synthesis / /api/v1/tasks/{task_id} | model + input (parameters optional) | 200, output.task_id | output.video_url |
Success codes differ (200 or 202), so treat any 2xx as an accepted submission. Seedance and Grok wrap the response in task; Kling and Hailuo use top-level fields. In-progress values differ too (pending / processing on Seedance, queued / processing on Kling and Hailuo), but the final states are always completed or failed. Wan and HappyHorse report output.task_status, ending in SUCCEEDED or FAILED.
Video model families compared
Every value below comes from the HopBase docs. For variants, trust the complete IDs that GET /v1/models returns for your key:
| Family and model IDs | Resolutions | Duration (s) | Reference inputs | Audio |
|---|---|---|---|---|
Seedance 2.0: dreamina-seedance-2-0-260128 (Standard), -fast-260128, -mini-260615; China IDs doubao-seedance-2-0-*-a | Standard 480p / 720p / 1080p, plus 4K on overseas Standard; Fast and Mini 480p / 720p | 4–15 or -1 | content: images ≤9, videos ≤3, audio ≤3 | generate_audio (send it explicitly on 2.0) |
Seedance 2.5: dreamina-seedance-2-5-260628; China ID doubao-seedance-2-5-260628-a | 480p / 720p / 1080p (overseas 1080p depends on the group; no 4K) | 4–30 or -1 | content: images ≤30, videos ≤10, audio ≤10 | generate_audio, default true |
Kling 4.0: kling-v4 | 720p / 1080p | 3–30 | Text-to-video and first-frame image-to-video only | Always has sound; audio does not change the price |
Kling 3: kling-v3, kling-v3-omni, kling-v3-turbo | 720p / 1080p / 2k / 4k | 3–15 | images[] / videos[], subjects; shots storyboards on v3 and v3-omni | Audio or silent on v3 and v3-omni |
Hailuo H3: MiniMax-H3 | 768P / 2K | 4–15 | content: images ≤9, videos ≤3, audio ≤3, ≤12 total | Built in |
Hailuo H3-Max: MiniMax-H3-Max | 480P / 768P | 5–15 | Text or first/last frame only; no reference_* | Built in |
Grok Imagine: grok-imagine-video-1.5 | 480p / 720p / 1080p (480p / 720p with reference images) | 1–15 | Top-level reference_images ≤14, public URLs only | No audio parameter (generate_audio is rejected) |
Wan 3.0: wan3.0-video | 480P / 720P / 1080P | 2–30 | input.media[]: images ≤10, videos ≤5, audio ≤5, ≤1 document or webpage | audio switch, same price |
HappyHorse 1.1: happyhorse-1.1-t2v / -i2v / -r2v | 480P / 720P / 1080P | 3–15 | t2v none; i2v exactly 1 first frame; r2v 1–9 reference images | — |
Kling also offers motion control (kling-v3-motion-control), avatar (kling-avatar) and lip sync (kling-lip-sync) on the same task API.
Complete example: submit and poll Seedance 2.5
1. Submit the task. All fields are top-level; do not nest them under parameters:
curl https://api.hop-base.com/v1/video/generate \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-5-260628",
"content": [
{ "type": "text", "text": "An orange cat runs across sunlit grass as the camera follows" }
],
"duration": 5,
"resolution": "720p",
"ratio": "16:9",
"generate_audio": false,
"watermark": false
}'
2. A successful submit returns 200. Keep task.id:
{
"task": {
"id": "vtEXAMPLE",
"model": "dreamina-seedance-2-5-260628",
"status": "pending",
"outputs": [],
"error": null,
"created_at": "2026-09-23T08:00:00Z",
"completed_at": null
}
}
3. Poll every 5 seconds until task.status is completed or failed. Polling is not billed and uses no concurrency:
curl https://api.hop-base.com/v1/video/tasks/vt-your-task-id \
-H "Authorization: Bearer sk-your-key"
4. When it completes, read the clip URL from task.outputs (an array of strings). The top-level usage.cost_usd is the USD amount actually deducted for the task. Links are valid for 24 hours after completion and return 410 afterwards, so download promptly. 480p and 720p clips usually take 2–5 minutes.
To move to another family, keep the polling code and change only the request body. Kling uses prompt + aspect_ratio; Hailuo uses MiniMax's v2 content + resolution + duration. One trap: Seedance silently ignores size, seconds, n and aspect_ratio and falls back to the default duration and 720p, so always send duration, resolution and ratio.
Compared with going to each vendor's own console
| Criterion | Each vendor separately | Unified task API (HopBase) |
|---|---|---|
| Accounts | Register, verify and top up on every platform | One account, one key (up to 10 groups) |
| Request format | Different per vendor | Still per family, but one submit and poll path (except Wan / HappyHorse) |
| Billing unit | Different per vendor; you normalize | Still different: Seedance per million video tokens; Kling, Hailuo, Wan and Grok per second; all from one USD balance |
| Cost per task | Read each vendor's invoice | Returned as usage.cost_usd once the task ends |
| Result links | Lifetimes differ | 24 hours for every family |
Pricing and billing rules
- Price = the vendor's official list price × your group rate; see the pricing page. Official list price examples:
MiniMax-H3-Max480p $0.05 per second,kling-v4720p $0.1471 per second,wan3.0-video480p $0.04412 per second. - Failed video tasks are not billed, and neither are submit-time 400s.
- At submission the check is available balance minus in-flight estimates minus this task's estimate; if that falls short you get 402
insufficient_balance. - Tasks cannot be cancelled. Do not resubmit after a successful submit: every resubmission is another billed task.
More detail: How to access Chinese AI video models outside China walks through each family's setup; Seedance API pricing explained converts tokens to cost per second; the Kling 4.0 API guide covers kling-v4; every field is in the video docs. To try it, sign up and create a key with the video groups you need.
FAQ
Is there one API that supports Seedance, Kling and Hailuo?
Yes. On HopBase, those three and Grok Imagine video share POST /v1/video/generate and GET /v1/video/tasks/{task_id}; add the matching groups to one key. Request bodies follow each family's fields, and one polling loop works for all of them.
Am I charged when a video generation fails?
No. Failed video tasks are not billed, and the task query shows usage.cost_usd as 0. Requests rejected at submission, such as a 400 for a bad parameter, are not billed either.
Which Seedance IDs should overseas developers use?
Seedance is the only family with two ID sets: overseas dreamina-seedance-* and China doubao-seedance-*-a, each needing a key with its own group. 4K exists only on overseas 2.0 Standard. Kling, Hailuo, Wan and Grok have one set of IDs. Call GET /v1/models to see exactly what your key can use.