Ltx 2.3 Spicy Image To Video LoRA
Playground
Try it on WavespeedAI!LTX 2.3 Spicy LoRA Image to Video API turns a reference image and prompt into expressive AI videos using selectable LoRA presets, optional LoRA strength overrides, duration, and resolution controls. Run fast REST inference on WaveSpeedAI with no cold starts and affordable pricing.
Features
Ltx-2.3-spicy/image-to-video-lora
wavespeed-ai/ltx-2.3-spicy/image-to-video-lora uses the same audio-video generation pipeline as the base image-to-video endpoint, while adding a curated LoRA stack for stronger style, motion, and visual control. You can use the recommended preset or override individual LoRA strengths per request.
Why Choose This?
-
Same base image-to-video workflow Uses the same core audio-video pipeline as the base
image-to-videoendpoint. -
Preset-based LoRA control Choose between
originalfor lighter styling ortunedfor the recommended LoRA stack. -
Per-LoRA override support Override individual LoRA strengths on top of the selected preset for more flexible control.
-
Style, motion, and look control Fine-tune visual style, motion behavior, and overall output feel with a curated LoRA set.
-
Unlimited creative flexibility Designed for users who want more direct control over the generation result.
Parameters
This endpoint supports all inputs from the base image-to-video endpoint, plus the following extra fields:
| Parameter | Required | Description |
|---|---|---|
preset | No | LoRA preset. original applies lighter styling. tuned applies the recommended LoRA stack. Default: tuned. |
loras | No | Per-LoRA strength overrides merged on top of the selected preset. Example: {"omninft": 0.5, "better_motion": 0.3}. Unknown keys are ignored. Default: {}. |
Available LoRA Keys
sulphur, sulphur_v1, vbvr, dreamly, synth, plora, singularity, omninft, omninft_bf16, better_motion, physics_v2, hardcut, transition
How to Use
- Prepare your base image-to-video inputs — Use the same required inputs as the base
image-to-videoendpoint. - Choose a preset (optional) — Use
tunedfor the recommended LoRA stack ororiginalfor a lighter effect. - Set LoRA overrides (optional) — Pass a
lorasobject to adjust individual LoRA strengths. - Submit — Generate the final video result with LoRA-enhanced control.
Pricing
| Resolution | Per 5s | Per second | Max length |
|---|---|---|---|
| 480p | $0.15 | $0.03 / s | 20 s |
| 720p | $0.25 | $0.05 / s | 20 s |
| 1080p | $0.35 | $0.07 / s | 20 s |
Billing Rules
- Minimum charge: 5 seconds.
- Maximum billed duration: 20 seconds.
720pcosts 5/3× the480pprice.1080pcosts 7/3× the480pprice.- Billing is based on
max(5, min(duration, 20)).
Best Use Cases
- Style-controlled image-to-video generation — Apply stronger visual styling on top of the base image-to-video workflow.
- Motion tuning — Use motion-focused LoRAs such as
better_motionorphysics_v2to guide output behavior. - Look-and-feel customization — Combine preset stacks and LoRA overrides to shape the final visual result.
- Creative experimentation — Try different LoRA combinations for varied output styles and motion characteristics.
Pro Tips
- Use
preset = tunedfor the recommended default behavior. - Use
preset = originalwhen you want results closer to the base input style. - Use the
lorasobject to override only the LoRAs you want to adjust. - Set a LoRA value to
0if you want to disable that LoRA while keeping the rest of the preset unchanged. - Start with a small number of LoRA overrides before stacking many changes together.
Notes
- This endpoint includes all base
image-to-videoinputs and addspresetandloras. - Default
presetistuned. - Default
lorasvalue is{}. - Unknown LoRA keys are ignored.
- Each active LoRA adds approximately 0.5–0.8 seconds of extra runtime at 480p / 5s.
- In the worst case, using all 13 LoRAs may increase runtime by approximately 30% compared with using no LoRAs.
- Pass
loras: {"omninft": 0}to fully disable that LoRA from the selected preset without changing the rest. - By using this endpoint, you confirm that you have the right to generate the requested content under your jurisdiction.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/ltx-2.3-spicy/image-to-video-lora" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"preset": "tuned",
"loras": [],
"resolution": "480p",
"duration": 5,
"seed": -1
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | Reference image for the first frame (JPG/PNG recommended). | |
| prompt | string | Yes | - | Positive prompt describing the desired motion / scene. | |
| preset | string | No | tuned | tuned, original | LoRA preset bundle. `original` = light styling. `tuned` = the recommended general-purpose stack. Overridden per-LoRA via `loras`. |
| loras | array | No | max undefined items | Optional list of LoRA strength overrides merged on top of the preset, e.g. `[{"path": "sulphur", "scale": 0.3}, {"path": "omninft", "scale": 0.5}]`. | |
| loras[].path | string | Yes | - | Path to the LoRA model | |
| loras[].scale | float | Yes | - | 0.0 ~ 4.0 | Scale of the LoRA model |
| resolution | string | No | 480p | 480p, 720p, 1080p | Output resolution tier. |
| duration | integer | No | 5 | 3 ~ 20 | Output duration in seconds (3-20). |
| seed | integer | No | -1 | -1 ~ 2147483647 | Random seed. -1 for a random seed. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content (empty when status is not completed). |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |