Generate Videos
Overview
Submit a unified video generation task through API Mall. This endpoint is the real public contract for Sora, Veo, Wan, Kling, Hailuo, Seedance, and other supported video models, exposed as a single model-driven API.
Authentication
All API requests require a Bearer token in the request header.
Authorization: Bearer YOUR_API_KEYCreate and manage API keys from API Keys or use https://www.apimall.ai/api-keys.
1. Create Generation Task
API Information
- URL:
POST https://gateway.apimall.ai/api/v1/videos/generate - Content-Type:
application/json
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | stringsora2sora2-stablesora2-pro | Required | Model identifier for this endpoint. Default: |
type | stringtext-to-videoimage-to-videovideo-to-video | Optional | Task mode for the selected model. Default: |
prompt | string | Optional | Prompt or edit instruction for the video generation task. |
input_image | string | Optional | Single reference image URL for image-to-video workflows. |
image_urls | array | Optional | Reference image URLs for image-to-video or multi-image workflows. |
image_url | string | Optional | Legacy single-image alias used by some provider adapters. |
video_url | string | Optional | Source video URL for video-to-video or edit workflows. |
audio_url | string | Optional | Audio track URL for avatar or audio-conditioned video workflows. |
end_image_url | string | Optional | Optional ending frame URL for supported models. |
hailuo_model | string | Optional | Explicit Hailuo provider model override. |
origin_task_id | string | Optional | Original task ID for follow-up or character continuation workflows. |
character_user_name | string | Optional | Character name used by Sora character continuation workflows. |
character_prompt | string | Optional | Character creation prompt used by Sora character workflows. |
safety_instruction | string | Optional | Additional safety instruction passed to supported providers. |
upload_method | strings3oss | Optional | Provider-side storage target for compatible models. |
aspect_ratio | string | Optional | Aspect ratio or layout preset for supported models. |
mode_option | stringnormalfunspicy | Optional | Sora creative mode option. |
n_frames | string51015 | Optional | Sora frame count option. |
size | stringstandardhigh | Optional | Provider-specific quality or size tier. |
remove_watermark | boolean | Optional | Remove provider watermark when supported. |
character_id_list | array | Optional | Character branch IDs for Sora continuation workflows. |
progress_callback_url | string | Optional | Optional callback URL for intermediate progress updates.
|
progressCallBackUrl | string | Optional | Optional callback URL for intermediate progress updates.
|
generation_type | stringFIRST_AND_LAST_FRAMES_2_VIDEOREFERENCE_2_VIDEO | Optional | Veo generation mode for frame-conditioned jobs. |
watermark | boolean | string | Optional | Provider watermark control where supported. |
seeds | integer | array | Optional | Optional deterministic seed or list of seeds. |
enable_fallback | boolean | Optional | Allow fallback generation behavior when supported. |
enable_translation | boolean | Optional | Enable prompt translation for providers that support it. |
duration | string | Optional | Video duration in seconds. |
resolution | string | Optional | Requested resolution tier for supported models. |
negative_prompt | string | Optional | Negative prompt passed to models that support it. |
enable_prompt_expansion | boolean | Optional | Let the provider expand the prompt before generation. |
seed | integer | Optional | Optional random seed for supported models. |
sound | boolean | Optional | Enable synced sound generation for supported video models. |
quality | string | Optional | Kling quality tier. |
audio | boolean | Optional | Enable audio synthesis when supported. |
cfg_scale | number | Optional | Guidance scale for supported edit workflows. Range: 0 - 1 |
character_orientation | stringimagevideo | Optional | Kling avatar orientation mode. |
multi_shots | boolean | Optional | Enable multi-shot generation for supported Kling models. |
fixed_lens | boolean | Optional | Lock the camera lens for supported Seedance models. |
generate_audio | boolean | Optional | Generate audio together with the video on supported models. |
Request Example
{
"model": "sora2",
"type": "text-to-video",
"prompt": "A cinematic drone shot of a futuristic city at sunrise.",
"aspect_ratio": "landscape",
"n_frames": "10",
"remove_watermark": false
}Response Example
{
"success": true,
"data": {
"task_id": "vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D",
"request_id": "provider_req_01HQ9MAGWQJZ0RZN6G40YRMN6E",
"credits_used": 30,
"remaining_credits": 90,
"model": "sora2"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}cURL Example
curl --request POST 'https://gateway.apimall.ai/api/v1/videos/generate' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "sora2",
"type": "text-to-video",
"prompt": "A cinematic drone shot of a futuristic city at sunrise.",
"aspect_ratio": "landscape",
"n_frames": "10",
"remove_watermark": false
}'JavaScript Example
const API_KEY = process.env.APIMALL_API_KEY;
const CREATE_URL = 'https://gateway.apimall.ai/api/v1/videos/generate';
const payload = {
"model": "sora2",
"type": "text-to-video",
"prompt": "A cinematic drone shot of a futuristic city at sunrise.",
"aspect_ratio": "landscape",
"n_frames": "10",
"remove_watermark": false
};
async function createTask() {
const response = await fetch(CREATE_URL, {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
});
if (!response.ok) {
throw new Error(`Create task failed: ${response.status} ${response.statusText}`);
}
const json = await response.json();
const taskId = json.data?.task_id;
if (!taskId) {
throw new Error('Missing task_id in create response');
}
return taskId;
}
async function getTask(taskId) {
const response = await fetch(`https://gateway.apimall.ai/api/v1/videos/${encodeURIComponent(String(taskId))}`, {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
if (!response.ok) {
throw new Error(`Query task failed: ${response.status} ${response.statusText}`);
}
const json = await response.json();
return {
...json,
};
}
async function waitForTask(taskId) {
while (true) {
const task = await getTask(taskId);
const state = task.data?.status;
if (state === 'completed') {
return task;
}
if (state === 'failed') {
throw new Error(task.data?.failMsg || 'Task failed');
}
await new Promise((resolve) => setTimeout(resolve, 3000));
}
}
(async () => {
const taskId = await createTask();
const result = await waitForTask(taskId);
console.log(result);
})().catch(console.error);Response Parameters
| Parameter | Type | Description |
|---|---|---|
success | boolean | Whether the request completed successfully. |
data.task_id | string | Task ID used to query task status and results. |
data.request_id | string | Provider-side request identifier for tracing. |
data.credits_used | integer | Credits consumed by this request. |
data.remaining_credits | integer | Credits remaining after the request. |
data.model | string | Model name used for the task. |
request_id | string | Request identifier for debugging and support. |
Error Response Example
{
"success": false,
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}2. Query Task Status
API Information
- URL:
GET https://gateway.apimall.ai/api/v1/videos/{task_id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Required | Video task identifier returned by `POST /api/v1/videos/generate`. |
Request Example
GET https://gateway.apimall.ai/api/v1/videos/vid_01HQ9MA3M6V6HC6S5R9V7N4Q4DcURL Example
curl --request GET 'https://gateway.apimall.ai/api/v1/videos/vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D' \
--header 'Authorization: Bearer YOUR_API_KEY'Response Example
{
"success": true,
"data": {
"task_id": "vid_01HQ9MA3M6V6HC6S5R9V7N4Q4D",
"model": "sora2",
"status": "completed",
"output": {
"resultUrls": [
"https://cdn.apimall.ai/generated/video-01.mp4"
]
},
"video_url": "https://cdn.apimall.ai/generated/result.mp4",
"error_message": null,
"credits_used": 30,
"credits_refunded": 0,
"created_at": "2026-03-12T09:35:00.000Z",
"updated_at": "2026-03-12T09:36:48.000Z",
"completed_at": "2026-03-12T09:36:48.000Z"
},
"request_id": "req_01HQ9M7J7X9P7Y8T6W5V4U3S2R"
}Response Parameters
| Parameter | Type | Description |
|---|---|---|
success | boolean | Whether the request completed successfully. |
data.task_id | string | Task ID used to query task status and results. |
data.model | string | Model name used for the task. |
data.status | string | Current status value returned by the API. Generation task endpoints use normalized values such as `pending`, `processing`, `completed`, `failed`, or `unknown`; management endpoints may return resource states such as `created`, `revoked`, or `active`. |
data.output.resultUrls | array | Generated result URLs returned by the upstream provider payload. |
data.video_url | string | Hosted video result URL. |
data.error_message | string | Failure reason returned when the music task does not complete successfully. |
data.credits_used | integer | Credits consumed by this request. |
data.credits_refunded | integer | Credits refunded after failure or partial refund handling. |
data.created_at | string | Creation timestamp for the returned resource or task record. |
data.updated_at | string | Last update timestamp for the returned resource or task record. |
data.completed_at | string | Completion timestamp for the task when available. |
request_id | string | Request identifier for debugging and support. |
Usage Flow
- Create a generation task by calling `POST https://gateway.apimall.ai/api/v1/videos/generate`.
- Persist `data.task_id` from the create response so you can resume polling later.
- Poll `GET https://gateway.apimall.ai/api/v1/videos/{task_id}` until `data.status` reaches `completed` or `failed`.
- Read the generated video URLs from the final task payload.
Integration Notes
- Store your API key on the server side only.
- Persist the returned `data.task_id` immediately so you can resume polling after restarts.
- Use an `Idempotency-Key` header when retrying create requests from your backend.
- Poll the task endpoint every few seconds with backoff until `data.status` reaches `completed` or `failed`.
- Use `data.video_url` as the final hosted asset URL.
Error Codes
Common Error Codes
| Status Code | Description |
|---|---|
| 200 | Request successful |
| 400 | Invalid request parameters |
| 401 | API key required or invalid API key |
| 402 | Insufficient credits |
| 403 | API access not approved or request made on a non-gateway host |
| 409 | Idempotency-Key conflict |
| 429 | Rate limit exceeded or too many concurrent jobs |
| 503 | Upstream provider is busy or temporarily unavailable |
| 451 | Prompt blocked by content moderation |
| 500 | Internal server error |