Vidu: Q2 Text-to-Video
Vidu Q2 creates video from a text scene brief, with 1–10-second duration, 540p, 720p or 1080p output and five aspect ratios. This exact viduq2 profile uses the prompt for style and motion and returns its result through an asynchronous task.
About the model
This description covers the model’s capabilities. Available in Ailoot inputs, outputs and options are listed for the selected method below.
Vidu Q2 creates video from a written scene through the text-to-video profile selected by viduq2. Its required inputs are the exact model identifier and a prompt describing the scene. Use it for a short product concept, an establishing view or a character action whose appearance and movement can be specified in words. This configured method is text-to-video; its description does not assign a separate image-reference or video-editing mode to the selector.
Build the brief around a visible sequence. Identify the subject, location, action, shot size, camera movement and final composition. For a product concept, describe an object on a tabletop, light moving across its material and a slow camera approach that ends on a recognizable detail. For a location scene, establish the environment before moving toward the focal point. Keep the action appropriate to the chosen clip length so the scene has room for its intended ending.
The prompt limit is 2,000 characters. Put the essential subject and action first, then add the lighting, material, environment and camera details that change the desired result. Specify the visual style in the prompt. The Q2-specific guide says the separate style and movement_amplitude parameters do not take effect for this model, so the general or anime preset and the motion-amplitude options are not substitutes for a clear scene description.
The model-specific duration setting accepts whole seconds from one to ten. The Q2-specific resolution choices are 540p, 720p and 1080p, with 720p as the documented default. Choose duration and resolution together according to the action and destination. A short reveal and a longer movement need different timing; increasing the requested duration should serve the visible sequence rather than simply stretching an unchanged brief. Inspect the returned clip's actual dimensions and length when preparing the final placement.
The documented aspect_ratio choices are 16:9, 9:16, 3:4, 4:3 and 1:1, with 16:9 as the default. The guide explicitly includes 3:4 and 4:3 for the Q2 family. Pick the frame before generation and describe a composition suited to it: keep a principal subject readable in a portrait view, or use the width of a landscape frame for the surrounding setting. Leave the closing view clear enough for the intended page, presentation or later caption treatment.
The seed field controls variation. Omitting it or supplying 0 selects a random value; a nonzero value selects the documented fixed-seed option for repeatable generation. Preserve the returned seed with the prompt and settings when comparing versions. The shared operation also documents audio and off_peak controls specifically for Q3 models. Those Q3 options are not capabilities assigned to this Q2 profile; plan this request around its documented text input and video output.
Generation is asynchronous. Submission returns task_id and an initial state, with created used for a newly created task. Retain that task identity while following processing. The documented result query uses state=success for a successful result and returns a creations array. Each entry has its video URL in creations[].url; save every returned video rather than assuming the task always contains exactly one creation.
The result documentation also reports the actual video's duration, fps and resolution width and height. Keep those reported values with the completed clip instead of treating an example's frame rate or dimensions as a fixed Q2 specification. The task-creation response includes a credits value alongside the request configuration. Retain that reported task metadata and the completed identity with the result, so each video remains connected to its generation settings.
Review the entire sequence against the original brief: subject appearance, object shape, movement direction, camera continuity and the intended final view. For a revision, identify the concrete detail that missed the brief and preserve the successful parts of the scene. Keep the prompt, exact selector, settings, task identity and completed videos together so a later comparison is based on the actual artifacts.
Ailoot Ultra · Video POST /v1/videos viduq2
viduq2Overview
Vidu Q2 creates video from a text scene brief, with 1–10-second duration, 540p, 720p or 1080p output and five aspect ratios. This exact viduq2 profile uses the prompt for style and motion and returns its result through an asynchronous task.
- Accepted inputs
- Text
- Results
- Video
Available in Ailoot · inputs & methods
Ailoot Ultra · Video POST /v1/videos
- Input types
text- Output types
video
| Field | Type | Requirement | Values & limits | Default |
|---|---|---|---|---|
Fieldmodel | Typestring | RequirementRequired | Values & limits viduq2 | Default— |
Fieldprompt | Typestring | RequirementRequired | Values & limits Conditions: Describe the generated scene. The documented limit is 2000 characters; Ailoot checks a non-empty string and preserves the text. | Default— |
Fieldduration | Typeinteger | RequirementOptional | Values & limits Minimum: 1 Maximum: 10 Conditions: The model-specific viduq2 description specifies 1–10 whole seconds. No model-specific default duration is documented. Unit: seconds | Default— |
Fieldseed | Typestring | RequirementOptional | Values & limits Conditions: Omit or send the string "0" for randomness. A non-zero supplied seed selects the documented fixed-seed behavior; no numeric range is specified. | Default— |
Fieldaspect_ratio | Typestring | RequirementOptional | Values & limits 16:9, 9:16, 3:4, 4:3, 1:1 | Default16:9 |
Fieldresolution | Typestring | RequirementOptional | Values & limits 540p, 720p, 1080p Conditions: The model-specific viduq2 list documents these tiers for 1–10 seconds. A shared enum and table also mention 360p; its applicability conflicts with that list and is not asserted here. | Default720p |
Fieldstyle | Typestring | RequirementOptional | Values & limits general, anime Conditions: The shared request accepts this field, but the documentation explicitly says it has no effect for viduq2. | Defaultgeneral |
Fieldmovement_amplitude | Typestring | RequirementOptional | Values & limits auto, small, medium, large Conditions: The shared request accepts this field, but the documentation explicitly says it has no effect for q2 models. | Defaultauto |
Input material combinations
Method parameters and lifecycle
| Parameter | Contract |
|---|---|
Parametercontent_type | Contractapplication/json |
Parameterrequired | Contractmodel, prompt |
Parameteroptional | Contractduration, seed, aspect_ratio, resolution, style, movement_amplitude |
Parametermaterial_types | Contracttext |
Parameteradditional_properties | Contracttrue |
Parametervalidation_scope | ContractAiloot validates the non-empty model/prompt strings. Optional types and limits below are the documented request contract; other request fields are preserved for the selected model. |
Method aliases: /v1/videos/generations
Lifecycle: submit_once_poll_original
GET /v1/videos/{request_id}
GET /v1/videos/generations/{request_id}
GET /v1/videos/{request_id}/content
GET /v1/videos/generations/{request_id}/content
Create once and retain the returned public id and polling_url.
Poll the original operation and read state; success and an owned creations[].url result are the completion boundary.
Download every returned owned video URL; do not infer a fixed output count, duration or frame rate from the example.
Pricing
How the final charge is calculated
The displayed rates estimate the cost before generation. The final charge is calculated from the cost recorded for the original generation. Measured output duration and forecast quantities are not the final billable quantity.
Tariff references do not add request options. Supported parameters are listed for the selected method.
- Fast mode
- Not specified When fast mode is selected
- Flex mode
- Not specified When flex mode is selected
- Maximum reasoning effort
- Not specified When maximum reasoning effort uses the default adjustment
Estimated rates for comparison
Prices by configuration
Match each charge to the conditions shown. Use one rate for each set of alternative configurations.
| Configuration | Rate schedule | Forecast quantity | Charge |
|---|---|---|---|
| ConfigurationBase token rates | Rate scheduleBase rate | Forecast quantity— | Charge Input · Input tokens · Estimate for comparison only — / 1K tokens Output · Output tokens · Estimate for comparison only — / 1K tokens Input · Cache read · Estimate for comparison only — / 1K tokens Input · Cache write · Estimate for comparison only — / 1K tokens Input · Cache write, 1 hour · Estimate for comparison only — / 1K tokens |
| ConfigurationEstimated generation cost | Rate schedule— | Forecast quantityone generation estimate | Charge Output · Estimated generation cost · Estimate for comparison only $5.12 estimate before generation This estimate is not an additional charge or a fixed rate for the completed generation. |
Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →
Example requests
Ailoot Ultra · Video
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
cat > request.json <<'JSON_REQUEST'
{"model":"viduq2","prompt":"In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene."}
JSON_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_POLL'
import json
from pathlib import Path
from urllib.parse import quote,urljoin,urlsplit
r=json.loads(Path("result.json").read_text())
i=r.get("id")
if not isinstance(i,str) or not i:raise SystemExit("Keep original response/headers/id; do not resubmit creation.")
u=urljoin("https://api.ailoot.ai",r.get("polling_url") or "/v1/videos/"+quote(i,safe=""))
p=urlsplit(u)
if p.scheme!="https" or p.netloc!="api.ailoot.ai" or not p.path.startswith("/v1/videos/"):raise SystemExit("Use the actual Ailoot lookup path.")
Path("poll-url.txt").write_text(u)
PY_POLL
curl --fail-with-body --silent --show-error "$(cat poll-url.txt)" -H "Authorization: Bearer $AILOOT_API_KEY" -D status-headers.txt -o status.json
set -eu
python3 - <<'PY_ASSETS'
import json
from pathlib import Path
from urllib.parse import urlsplit
r=json.loads(Path("status.json").read_text())
if r.get("state")!="success":raise SystemExit("Poll the same original job until its owned result is returned.")
creations=r.get("creations")
if not isinstance(creations,list) or not creations:raise SystemExit("No completed video creations.")
urls=[]
for item in creations:
value=item.get("url") if isinstance(item,dict) else None
values=[value] if isinstance(value,str) else value
if not isinstance(values,list) or not values:raise SystemExit("No completed video URL.")
for u in values:
if not isinstance(u,str):raise SystemExit("Invalid returned URL.")
p=urlsplit(u)
if p.scheme!="https" or p.netloc!="api.ailoot.ai" or not p.path.startswith("/v1/media/assets/") or not p.path.endswith("/content") or not p.query:raise SystemExit("Wait for the actual Ailoot-owned signed result.")
urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_ASSETS
index=0
while IFS= read -r asset_url; do
curl --fail-with-body --silent --show-error "$asset_url" -o "video-${index}.bin"
index=$((index + 1))
done < asset-urls.txt
Receive and save results
Ailoot Ultra · Video
JSON retains the native state and creations array, with public id/provider_task_id/polling_url added. Selected video URLs are blank before publication and become Ailoot-owned signed URLs after completion.
GET /v1/videos/{request_id}GET /v1/videos/generations/{request_id}GET /v1/videos/{request_id}/contentGET /v1/videos/generations/{request_id}/content
Keep all completed results
Save every completed video or returned file; retrieve every actual returned asset URL.
Download every actual returned URL in creations[].url; a content index identifies one real returned output.
If the original response needs checking
The pinned declaration enumerates no terminal failure state. Preserve original response/headers/id and check that same operation for any unrecognized state or result_pending_check error; never resubmit an unknown creation.
Response fields
| Field | Type | Meaning |
|---|---|---|
Fieldid | Typestring | MeaningReturned public Ailoot task or operation identifier. |
Fieldprovider_task_id | Typestring | MeaningOriginal task identifier, separate from the public id. |
Fieldpolling_url | Typestring | MeaningReturned Ailoot lookup path for the original task. |
Fieldtask_id | Typestring when supplied | MeaningOriginal identifier present in the creation response. |
Fieldstate | Typestring when supplied | MeaningNative task state: created for the pinned pending state and success for completion. |
Fielderr_code | Typestring when supplied | MeaningTask diagnostic; the saved specification declares no enumerated error-code list. |
Fieldcreations[].url | Typestring|string[] | MeaningEvery selected completed video URL is replaced with an Ailoot-owned signed URL. |
Fieldcreations[].video.duration | Typenumber when supplied | MeaningReturned video duration; inspect the actual completed result. |
Fieldcreations[].video.fps | Typeinteger when supplied | MeaningReturned frame rate; no fixed frame rate is promised. |
Fieldcreations[].video.resolution.width | Typeinteger when supplied | MeaningReturned output width in pixels. |
Fieldcreations[].video.resolution.height | Typeinteger when supplied | MeaningReturned output height in pixels. |
Errors and next steps
| Response | Condition | Next step |
|---|---|---|
Response400 · invalid_request_error | ConditionInvalid JSON/model, missing or empty required strings, or an invalid content index. | Next step |
Response401 · authentication_error | ConditionInvalid Ailoot API key. | Next step |
Response403 · permission_error | ConditionThe API key group is not admitted to this media route. | Next step |
Response404 · not_found_error | ConditionThe original task or requested output is absent or not owned by the same user/API key/group. | Next step |
Response502 · result_pending_check | ConditionOriginal submit or status is incomplete or cannot be reconciled; preserve the original ID and do not resubmit. | Next step |
Response503 · result_pending_check | ConditionThe original binding, route or owned media is still being checked; continue checking that original operation. | Next step |
Response503 · server_error | ConditionThe media service or original task storage is unavailable. | Next step |
Aliases
Model aliases
Ailoot Ultra viduq2
Method path aliases
/v1/videos/generations
Related caller IDs
FAQ · Vidu: Q2 Text-to-Video
- What inputs and results are available?
POST /v1/videos·viduq2:text→video- Which fields does the request use?
POST /v1/videos·viduq2:model,prompt,duration,seed,aspect_ratio,resolution,style,movement_amplitude- What limits apply?
POST /v1/videos·viduq2:duration.minimum:1;duration.maximum:10