models

Vidu: Q2 Text-to-Video

Markdown · JSON

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

viduq2

Vidu /viduq2

Overview

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
FieldTypeRequirementValues & limitsDefault
FieldmodelTypestringRequirementRequiredValues & limits
viduq2
Default—
FieldpromptTypestringRequirementRequiredValues & limits
Conditions: Describe the generated scene. The documented limit is 2000 characters; Ailoot checks a non-empty string and preserves the text.
Default—
FielddurationTypeintegerRequirementOptionalValues & 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—
FieldseedTypestringRequirementOptionalValues & 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_ratioTypestringRequirementOptionalValues & limits
16:9, 9:16, 3:4, 4:3, 1:1
Default16:9
FieldresolutionTypestringRequirementOptionalValues & 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
FieldstyleTypestringRequirementOptionalValues & limits
general, anime
Conditions: The shared request accepts this field, but the documentation explicitly says it has no effect for viduq2.
Defaultgeneral
Fieldmovement_amplitudeTypestringRequirementOptionalValues & 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
ParameterContract
Parametercontent_typeContractapplication/json
ParameterrequiredContractmodel, prompt
ParameteroptionalContractduration, seed, aspect_ratio, resolution, style, movement_amplitude
Parametermaterial_typesContracttext
Parameteradditional_propertiesContracttrue
Parametervalidation_scopeContractAiloot 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.

ConfigurationRate scheduleForecast quantityCharge
ConfigurationBase token ratesRate scheduleBase rateForecast 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 costRate schedule—Forecast quantityone generation estimateCharge
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

curl · create videocurl · read original taskcurl · download every owned 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}/content
  • GET /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
FieldTypeMeaning
FieldidTypestringMeaningReturned public Ailoot task or operation identifier.
Fieldprovider_task_idTypestringMeaningOriginal task identifier, separate from the public id.
Fieldpolling_urlTypestringMeaningReturned Ailoot lookup path for the original task.
Fieldtask_idTypestring when suppliedMeaningOriginal identifier present in the creation response.
FieldstateTypestring when suppliedMeaningNative task state: created for the pinned pending state and success for completion.
Fielderr_codeTypestring when suppliedMeaningTask diagnostic; the saved specification declares no enumerated error-code list.
Fieldcreations[].urlTypestring|string[]MeaningEvery selected completed video URL is replaced with an Ailoot-owned signed URL.
Fieldcreations[].video.durationTypenumber when suppliedMeaningReturned video duration; inspect the actual completed result.
Fieldcreations[].video.fpsTypeinteger when suppliedMeaningReturned frame rate; no fixed frame rate is promised.
Fieldcreations[].video.resolution.widthTypeinteger when suppliedMeaningReturned output width in pixels.
Fieldcreations[].video.resolution.heightTypeinteger when suppliedMeaningReturned output height in pixels.
Errors and next steps
ResponseConditionNext step
Response400 · invalid_request_errorConditionInvalid JSON/model, missing or empty required strings, or an invalid content index.Next step
Response401 · authentication_errorConditionInvalid Ailoot API key.Next step
Response403 · permission_errorConditionThe API key group is not admitted to this media route.Next step
Response404 · not_found_errorConditionThe original task or requested output is absent or not owned by the same user/API key/group.Next step
Response502 · result_pending_checkConditionOriginal submit or status is incomplete or cannot be reconciled; preserve the original ID and do not resubmit.Next step
Response503 · result_pending_checkConditionThe original binding, route or owned media is still being checked; continue checking that original operation.Next step
Response503 · server_errorConditionThe 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

viduq2

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

More details

Connect Ailoot to Claude Code, OpenCode, Hermes or your own app.

The company and its project portfolio

The company and its project portfolio: millions of customers; monthly sales in the billions.

Buy tokens at a discount.

Subscription discounts for regular use. Promo codes offer up to 50% off token purchases.

Subscription
Choose a discounted plan for your regular requests.
Promo code: up to 50% off
Enter your code at checkout. The price updates to reflect the current promotion.
Spending in your history
The model, tokens and amount are recorded for each request.

Choose a subscription · View model prices

Connect the API to a product you sell.

Use Ailoot in SaaS, apps and bots under its official service offer and licence agreement. Request a reseller licence for resale.

Commercial application
Add text, image, video and audio generation to paid features in your service.
Reseller licence
Send a description of your project and how you provide access. Request written terms for use and resale.
Documents on the website
The service offer, licence agreement and data processing policy are available before you connect.

Request a reseller licence · Service offer and licence agreement