One continuous five-second realistic portrait of a single adult female cellist seated on a plain chair in an empty wood-paneled chamber-music hall. She wears a simple dark green concert dress. The cello stands correctly between her knees with its endpin on the floor. Medium frontal three-quarter framing includes her face, both hands, complete bow and most of the cello. From the first frame the bow hair already rests across the strings between fingerboard and bridge. Her right arm draws the same straight bow slowly in ONE direction for the entire shot, maintaining contact with the strings; her left hand remains steadily on the neck. Her focused gaze follows the bow. Subtle slow camera push-in, soft warm side light and a quiet background. Preserve rigid instrument and bow geometry. No audience, no cuts, no text or logos.
Kling 2.5 Turbo Pro Text to Video API
kwaivgi/kling-v2.5-turbo-pro/text-to-videoKling 2.5 Turbo Pro Text to Video generates 5- or 10-second videos from descriptive text prompts. Describe subjects, actions, lighting and camera movement, with optional aspect ratio and negative prompt inputs.
775/2,500
Examples
REST API Reference
Quick Start
Submit a task and query its status. URLs using example.com or your-domain.com are placeholders; replace image and callback URLs with your own publicly accessible URLs. Output file URLs are illustrative.
Step 1: Set up authentication
Create an API key in the dashboard and attach Authorization: Bearer <API_KEY> when submitting a task.
- Submit Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authorization Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a task
POST /api/generate/submit: kwaivgi/kling-v2.5-turbo-pro/text-to-video
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.5-turbo-pro/text-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"duration": 5,
"aspect_ratio": "16:9"
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Step 3: Poll for completion
Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll with task_id while status is not_started or running, and stop at finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-example",
"status": "not_started",
"created_time": "2026-09-24T00:00:00Z"
}
}{
"code": 200,
"data": {
"task_id": "task-example",
"status": "finished",
"files": [
{
"file_type": "video",
"file_url": "https://example.com/output.mp4"
}
],
"created_time": "2026-09-23T00:00:00Z"
}
}Complete executable script
Expand to review an end-to-end script with automatic polling, error handling, and timeout safeguards.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "kwaivgi/kling-v2.5-turbo-pro/text-to-video",
"input": {
"prompt": "A slow camera pan across a sunlit garden.",
"duration": 5,
"aspect_ratio": "16:9"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters (input object)
Place generation parameters in input, with model and optional callback_url at the request root. Use standard JSON types; unsupported input fields are rejected.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | - | Required nonblank string, maximum 2,500 Unicode characters after trimming. |
| duration | integer | No | 5 | Duration accepts integer values 5 or 10 and defaults to 5 when omitted. Numeric 5.0 and 10.0 are accepted as integer values; strings, booleans, non-integer values and null are rejected. |
| aspect_ratio | string | No | - | aspect_ratio is an optional string. The API reference does not specify an enum or default; omit it when unused. |
| negative_prompt | string | No | - | negative_prompt is an optional string describing content to avoid. The API reference does not specify a length limit for it; the 2,500-character limit applies only to prompt. |
Response Fields (Status Query)
Details returned by GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | HTTP/business response status code (200 indicates success). |
| data.task_id | string | Globally unique task identifier. |
| data.status | string | Task lifecycle state: not_started, running, finished, or failed. |
| data.files | array | Array of output assets containing file_url and file_type upon completion. |
| data.error_message | string | null | Error diagnostic details if the task status is failed. |
Task Lifecycle
Clients should poll status until reaching either the finished or failed terminal state:
not_startedQueued
runningGenerating
finishedReady
failedFailed
Polling & Error Handling
- Polling frequencyStart polling with a 2 to 3-second interval, gradually increasing to 5 seconds for extended takes.
- Network resiliencyTransient 5xx responses or timeouts do not signify task failure; retry status requests after a short backoff.
- Webhook callbacksProvide a top-level callback_url in your submission payload to receive completion notifications automatically.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model | kwaivgi/kling-v2.5-turbo-pro/text-to-video | |
| Duration | 5 / 10 s | Duration accepts integer values 5 or 10 and defaults to 5 when omitted. Numeric 5.0 and 10.0 are accepted as integer values; strings, booleans, non-integer values and null are rejected. |
Kling 2.5 Turbo Pro Text to Video API frequently asked questions
What is the Kling 2.5 Turbo Pro Text to Video API?
Kling 2.5 Turbo Pro Text to Video generates 5- or 10-second videos from descriptive text prompts. Describe subjects, actions, lighting and camera movement, with optional aspect ratio and negative prompt inputs. Try it in the playground above or submit tasks through the REST API.
What video durations does Kling 2.5 Turbo Pro Text to Video support?
The model supports 5-second and 10-second video durations. Specify duration as an integer value of 5 or 10 in your request payload; if omitted, the system defaults to 5 seconds.
What aspect ratios does Kling 2.5 Turbo Pro Text to Video support?
aspect_ratio is an optional string. The API reference does not specify an enum or default; omit it when unused.
What is the prompt character limit for Kling 2.5 Turbo Pro Text to Video?
The prompt field accepts up to 2,500 Unicode characters after trimming. This generous capacity accommodates detailed storytelling, multiple action beats, and complex lighting or stylistic cues.
How does negative_prompt work in Kling 2.5 Turbo Pro Text to Video?
negative_prompt is an optional string describing content to avoid. The API reference does not specify a length limit for it; the 2,500-character limit applies only to prompt.
How is Kling 2.5 Turbo Pro Text to Video priced?
Pricing is billed on a per-video basis: 42 credits ($0.210) for a 5-second video, and 84 credits ($0.420) for a 10-second video. Credits are deducted upon submission, and if a task encounters an internal generation failure, all deducted credits are automatically refunded.
How do I retrieve a Kling 2.5 Turbo Pro Text to Video result?
Keep the task_id returned on submission and query GET /api/generate/status/{task_id}. When the status is finished, read video URLs from data.files. Stop polling on failed and inspect the error message.
Does Kling 2.5 Turbo Pro Text to Video accept image inputs?
No. This endpoint is dedicated strictly to text-to-video generation. If you have reference still images or wish to guide motion using starting and ending keyframes, use the Kling 2.5 Turbo Pro Image to Video endpoint.