=== URL: https://useapi.net/docs/start-here/setup-ltxstudio === Document URL: https://useapi.net/docs/start-here/setup-ltxstudio --- layout: default title: Setup LTX Studio parent: Start Here nav_order: 550 --- # Setup LTX Studio {: .no_toc } July 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} Approximately 5 minutes to complete setup steps. --- [LTX Studio](https://ltx.studio/) provides access to [LTX-Video](https://github.com/Lightricks/LTX-Video) models capable of generating video in a near real-time, Google's [Veo](https://gemini.google/overview/video-generation) model, and the [FLUX.1 Kontext](https://ltx.studio/blog/flux-kontext-in-ltx-studio) model. ### Use Gmail account to create a LTX Studio account Use your Gmail account to create a [LTX Studio](https://ltx.studio/) account if you don't have one already. ### Locate your LTX Studio `cookie` LTX Studio cookie expires after **3** months. You will need to repeat the process described below every **3** months. Open a Chromium-compatible browser (e.g. [Google Chrome](https://www.google.com/chrome/), [Microsoft Edge](https://www.microsoft.com/en-us/edge) or [Opera](https://www.opera.com/)) and navigate to [https://app.ltx.studio](https://app.ltx.studio/). If you are already logged in to your LTX Studio account, make sure to log out. This is an **IMPORTANT** step, do not skip it. ![](../../assets/images/ltxstudio_setup_1.png) Login to your LTX Studio account `1` and refresh the page `2`. Once the page is fully loaded, ensure that you're logged in. Open [Developer Tools](https://developer.chrome.com/docs/devtools) by right-clicking on the page and selecting "Inspect Element" or via [keyboard shortcuts](https://developer.chrome.com/docs/devtools/shortcuts): Mac `Command+Option+I` or Windows `F12` or `Control+Shift+I`. Select Developer Tools » Network `3`: * Make sure that `All` or `Fetch/XHR` is selected `4`. * Type `/me` in the filter box `5` and press Enter. * Locate the `me` http call shown on the image above `6`, click on that entry. * Select the "Headers" tab `7`. * Locate Request Headers `8` Cookie `9` and copy its **entire** value `10`. This is your `cookie`. As an example above the cookie: ```text optimizelyEndUserId=abc9376852143759a8.5293814067427834; x-country-code=CA; successfulLogin=true; lt_refresh_token=XZH3wPmQygrpBuZRXMvGb_ui8LmWVuQ4vx47JBkF82-xc4edziuGYeT9aNL7-k2v; lt_id=zxcwTYfgHrpxxBbOG3V-K; optimizelySession=2849625738195; lt_token=eyJh… ``` After the cookie is retrieved, **DO NOT LOG OUT** from the account and simply close the browser. Logging out will terminate your session and prevent the API from using your cookie. You **MUST** close the browser tab containing the session used to retrieve the cookie for the API. If you keep it open, the cookie will be refreshed within the browser and will prevent the API from refreshing your cookie properly, resulting in an email with an error message. If you want to use the account linked to the API from the browser, ensure that you **clear all cookies** before opening the ltx.studio website again. ### Configure LTX Studio API account This is a **REQUIRED** step. You **MUST** complete it in order to use your LTX Studio account via our API. Feel free to use the optional [Verify](#verify-cookie-value) feature below to ensure the retrieved cookie is correct before proceeding. Finally, proceed to [POST /accounts](../api-ltxstudio-v1/post-ltxstudio-accounts) and configure the LTX Studio API account using the `cookie` value retrieved above. Once the configuration is posted, you can start using the LTX Studio API immediately. ### Verify `cookie` value This only verifies that the `cookie` value is correct. To complete setup, you **MUST** proceed to [POST /accounts](../api-ltxstudio-v1/post-ltxstudio-accounts) and complete the configuration of the LTX Studio API account using the `cookie` value retrieved above.
=== URL: https://useapi.net/docs/api-ltxstudio-v1 === Document URL: https://useapi.net/docs/api-ltxstudio-v1 --- layout: default title: LTX Studio API v1 nav_order: 10000 has_children: true permalink: /docs/api-ltxstudio-v1 --- # LTX Studio API v1 June 18, 2025 (October 3, 2025) This is an [experimental](../../docs/legal) API for [LTX Studio](https://ltx.studio/), an AI-powered video creation platform developed by [Lightricks](https://lightricks.com/). [LTX Studio](https://ltx.studio/) provides access to multiple AI models for video and image generation. Video models: [LTX-Video](https://github.com/Lightricks/LTX-Video), [Veo 2](https://gemini.google/overview/video-generation), [Veo 3](https://gemini.google/overview/video-generation). Image models: [FLUX.1 Kontext](https://bfl.ai/models/flux-kontext), [FLUX.1 Kontext Max](https://bfl.ai/models/flux-kontext), [Nano Banana / Gemini 2.5 Flash Image](https://deepmind.google/technologies/gemini/flash/). LTX-Video, FLUX, and Nano Banana models enforce minimal content moderation and will generate adult content. Veo models have strict PG-13 moderation guardrails.
💲 Cost calculator Generation counts below are based on official LTX Studio pricing as of October 3, 2025.
Name Cost $ Credits Single credit cost
Standard (28000 credits per month) $35 28000 $0.00125

Generation Pricing

Generation Type Generations per month Single generation cost
FLUX 2333 $0.015
FLUX Premium N/A N/A
Nano Banana N/A N/A
LTXV Turbo 1400 $0.025
LTXV 430 $0.081
Veo 2 31 $1.129
Veo 3 Fast N/A N/A
Veo 3 N/A N/A
[Setup LTX Studio](../../docs/start-here/setup-ltxstudio) [Postman collection](https://www.postman.com/useapinet/useapi-net/collection) (January 20, 2026) [LLM-friendly API spec](https://useapi.net/assets/aibot/api-ltxstudio-v1.txt) Feed this to your LLM to build integrations Examples: * [FLUX.1 Kontext Max and Nano Banana samples](/blog/251003) * [LTX Studio samples](/blog/250603) * [Veo3](/blog/250618) * [LTX-V 30 seconds](/blog/250723) * [Veo3 Fast with Start Frame](/blog/250825) Developer Community: * Discord Server * Telegram Channel * r/ltx_api * r/flux_api === URL: https://useapi.net/docs/api-ltxstudio-v1/del-ltxstudio-accounts-email === Document URL: https://useapi.net/docs/api-ltxstudio-v1/del-ltxstudio-accounts-email --- layout: default title: DELETE accounts/email parent: LTX Studio API v1 nav_order: 103 --- ## Delete LTX Studio API account configuration {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint deletes a specific LTX Studio account configuration by email address. {: .delete } > **https://api.useapi.net/v1/ltxstudio/accounts/`email`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Path Parameters - `email` is **required**, specify the email address of the LTX Studio account to delete ##### Responses {% tabs delete_account_LtxStudio_v1_response %} {% tab delete_account_LtxStudio_v1_response 204 %} 204 No Content Account configuration deleted successfully. {% endtab %} {% tab delete_account_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab delete_account_LtxStudio_v1_response 404 %} 404 Not Found Account configuration not found for the specified email address. {% endtab %} {% endtabs %} ##### Examples {% tabs delete_account_LtxStudio_v1_example %} {% tab delete_account_LtxStudio_v1_example Curl %} ``` bash curl -X DELETE https://api.useapi.net/v1/ltxstudio/accounts/user@example.com \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab delete_account_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const email = "user@example.com"; const apiUrl = `https://api.useapi.net/v1/ltxstudio/accounts/${email}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", {response}); ``` {% endtab %} {% tab delete_account_LtxStudio_v1_example Python %} ``` python import requests token = "API token" email = "user@example.com" apiUrl = f"https://api.useapi.net/v1/ltxstudio/accounts/{email}" headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/del-ltxstudio-scheduler-jobId === Document URL: https://useapi.net/docs/api-ltxstudio-v1/del-ltxstudio-scheduler-jobId --- layout: default title: DELETE scheduler/jobId parent: LTX Studio API v1 nav_order: 520 --- ## Cancel a running job {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint cancels a running API job from being tracked by the scheduler. The job will still be executed by LTX Studio, but the API will no longer track its progress. {: .delete } > **https://api.useapi.net/v1/ltxstudio/scheduler/`jobId`** The `jobId` value should be a job identifier that you want to cancel. You can get it from [GET /scheduler](https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-scheduler). ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Responses {% tabs scheduler_jobId_delete_LtxStudio_v1_response %} {% tab scheduler_jobId_delete_LtxStudio_v1_response 204 %} 204 No Content Job was successfully canceled. {% endtab %} {% tab scheduler_jobId_delete_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab scheduler_jobId_delete_LtxStudio_v1_response 404 %} 404 Not Found ```json { "error": "Unable to locate running jobId email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "code": 404 } ``` {% endtab %} {% endtabs %} ##### Examples {% tabs scheduler_jobId_delete_LtxStudio_v1_example %} {% tab scheduler_jobId_delete_LtxStudio_v1_example Curl %} ``` bash curl -X DELETE "https://api.useapi.net/v1/ltxstudio/scheduler/email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab scheduler_jobId_delete_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const jobId = "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image"; const apiUrl = `https://api.useapi.net/v1/ltxstudio/scheduler/${encodeURIComponent(jobId)}`; const response = await fetch(apiUrl, { method: "DELETE", headers: { "Authorization": `Bearer ${token}`, }, }); console.log("response", {status: response.status, statusText: response.statusText}); ``` {% endtab %} {% tab scheduler_jobId_delete_LtxStudio_v1_example Python %} ``` python import requests import urllib.parse token = "API token" job_id = "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image" apiUrl = f"https://api.useapi.net/v1/ltxstudio/scheduler/{urllib.parse.quote(job_id, safe='')}" headers = { "Authorization" : f"Bearer {token}" } response = requests.delete(apiUrl, headers=headers) print(response.status_code, response.reason) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-accounts-email === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-accounts-email --- layout: default title: GET accounts/email parent: LTX Studio API v1 nav_order: 102 --- ## Retrieve specific LTX Studio API account configuration {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint retrieves a specific LTX Studio account configuration by email address, including current balance information. {: .get } > **https://api.useapi.net/v1/ltxstudio/accounts/`email`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Path Parameters - `email` is **required**, specify the email address of the LTX Studio account ##### Responses {% tabs get_account_LtxStudio_v1_response %} {% tab get_account_LtxStudio_v1_response 200 %} 200 OK ```json { "email": "user@example.com", "cookie": { "lt_id": "user123", "lt_token": "…secured…", "lt_refresh_token": "…secured…" }, "maxJobs": 20, "updatedUTC": "2025-06-03T12:13:14.000Z", "tokenExpireUTC": "2025-07-03T12:13:14.000Z", "balance": { "LTXStudio_token": 150 }, "latestCreatedAtMs": { "LTXStudio_token": 1717401194000 } } ``` {% endtab %} {% tab get_account_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab get_account_LtxStudio_v1_response 404 %} 404 Not Found Account configuration not found for the specified email address. {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional email: string cookie: { lt_id: string lt_token: string lt_refresh_token: string [key: string]: string } maxJobs: number updated: number tokenExpire: number updatedUTC?: string tokenExpireUTC?: string balance?: { LTXStudio_token: number } latestCreatedAtMs?: { LTXStudio_token: number } error?: string } ``` ##### Examples {% tabs get_account_LtxStudio_v1_example %} {% tab get_account_LtxStudio_v1_example Curl %} ``` bash curl https://api.useapi.net/v1/ltxstudio/accounts/user@example.com \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab get_account_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const email = "user@example.com"; const apiUrl = `https://api.useapi.net/v1/ltxstudio/accounts/${email}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab get_account_LtxStudio_v1_example Python %} ``` python import requests token = "API token" email = "user@example.com" apiUrl = f"https://api.useapi.net/v1/ltxstudio/accounts/{email}" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-accounts === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-accounts --- layout: default title: GET accounts parent: LTX Studio API v1 nav_order: 100 --- ## Retrieve LTX Studio API accounts configuration {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- For your convenience, you can specify your LTX Studio configuration values under your LTX Studio account. If you specify multiple LTX Studio accounts, the API will automatically perform load balancing by randomly selecting an account with available capacity before making calls to LTX Studio. This endpoint retrieves the complete list of configured API accounts for LTX Studio. {: .get } > **https://api.useapi.net/v1/ltxstudio/accounts** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Responses {% tabs account_LtxStudio_v1_response %} {% tab account_LtxStudio_v1_response 200 %} 200 OK ```json { "": { "email": "", "cookie": { "lt_id": "user12345", "lt_token": "…secured…", "lt_refresh_token": "…secured…" }, "maxJobs": 20, "updatedUTC": "2025-06-03T12:13:14.000Z", "tokenExpireUTC": "2025-07-03T12:13:14.000Z" }, "": { "email": "", "cookie": { "lt_id": "user67890", "lt_token": "…secured…", "lt_refresh_token": "…secured…" }, "maxJobs": 15, "updatedUTC": "2025-06-03T12:13:14.000Z", "tokenExpireUTC": "2025-07-03T12:13:14.000Z" } } ``` {% endtab %} {% tab account_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab account_LtxStudio_v1_response 404 %} 404 Not Found Configuration not found. To create configuration use [POST /accounts](https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-accounts). {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional [email: string]: { email: string cookie: { lt_id: string lt_token: string lt_refresh_token: string [key: string]: string } maxJobs: number updated: number tokenExpire: number updatedUTC?: string tokenExpireUTC?: string error?: string } } ``` ##### Examples {% tabs account_LtxStudio_v1_example %} {% tab account_LtxStudio_v1_example Curl %} ``` bash curl https://api.useapi.net/v1/ltxstudio/accounts \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab account_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/accounts"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab account_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/accounts" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-assets-jobId === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-assets-jobId --- layout: default title: GET assets/jobId parent: LTX Studio API v1 nav_order: 202 --- ## Retrieve LTX Studio job status {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint retrieves the status and result of a specific generation job by its `jobId` for following endpoints: * [POST videos/ltx-create](../api-ltxstudio-v1/post-ltxstudio-videos-ltx-create) * [POST videos/veo-create](../api-ltxstudio-v1/post-ltxstudio-videos-veo-create) * [POST images/flux-edit](../api-ltxstudio-v1/post-ltxstudio-images-flux-edit) * [POST images/flux-create](../api-ltxstudio-v1/post-ltxstudio-images-flux-create) {: .get } > **https://api.useapi.net/v1/ltxstudio/assets/`jobId`** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Path Parameters - `jobId` is **required**, specify the job to retrieve ##### Responses {% tabs get_job_LtxStudio_v1_response %} {% tab get_job_LtxStudio_v1_response 200 %} 200 OK ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/model-serving/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:video/mp4", "mimeType": "video/mp4", "artifactSubtype": "model-serving" } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback" } ``` {% endtab %} {% tab get_job_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab get_job_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab get_job_LtxStudio_v1_response 404 %} 404 Not Found Job not found or has expired. {% endtab %} {% endtabs %} ##### Model Make sure to check both field `status.type` value to be `completed` and field `artifact.assetUrl` to be present since they may be out of sync. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs get_job_LtxStudio_v1_example %} {% tab get_job_LtxStudio_v1_example Curl %} ``` bash curl https://api.useapi.net/v1/ltxstudio/assets/email:user@example.com-job:7a34…-type:video \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab get_job_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const jobId = "email:user@example.com-job:7a34…-type:video"; const apiUrl = `https://api.useapi.net/v1/ltxstudio/assets/${jobId}`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab get_job_LtxStudio_v1_example Python %} ``` python import requests token = "API token" job_id = "email:user@example.com-job:7a34…-type:video" apiUrl = f"https://api.useapi.net/v1/ltxstudio/assets/{job_id}" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-assets === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-assets --- layout: default title: GET assets parent: LTX Studio API v1 nav_order: 200 --- ## Retrieve LTX Studio assets {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint retrieves a paginated list of assets from your LTX Studio account, including images, videos, audio files, and other media. {: .get } > **https://api.useapi.net/v1/ltxstudio/assets/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Query Parameters - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `page` is optional, page number for pagination. Default is 1. - `limit` is optional, number of items per page. Default is 20. - `filter` is optional, filter assets by type. Supported values: `images`, `videos`, `audio`, `other`. Default is all types. ##### Responses {% tabs get_assets_LtxStudio_v1_response %} {% tab get_assets_LtxStudio_v1_response 200 %} 200 OK ```json { "items": [ { "id": "7a34b821-9fd0-205e-d21b-4abc6f7839e7", "signedAsset": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/model-serving/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:video/mp4", "mimeType": "video/mp4", "artifactSubtype": "model-serving" } }, "relatedAssets": { "thumbnails": { "large": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/images/…", "expirationDateString": "1748919477389", "asset": { "type": "image", "fileId": "3b18…-thumbnail-large", "mimeType": "image/webp" } } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video" } ], "meta": { "totalItems": 329, "itemCount": 3, "itemsPerPage": 3, "totalPages": 110, "currentPage": 1 } } ``` {% endtab %} {% tab get_assets_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab get_assets_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional items: Array<{ id: string jobId?: string signedAsset: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype?: string } } relatedAssets: { thumbnails: { large: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string } } } } }> meta: { totalItems: number itemCount: number itemsPerPage: number totalPages: number currentPage: number } } ``` ##### Examples {% tabs get_assets_LtxStudio_v1_example %} {% tab get_assets_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/assets/?email=user@example.com&page=1&limit=10&filter=images" \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab get_assets_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const email = "user@example.com"; const apiUrl = `https://api.useapi.net/v1/ltxstudio/assets/?email=${email}&page=1&limit=10&filter=images`; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab get_assets_LtxStudio_v1_example Python %} ``` python import requests token = "API token" email = "user@example.com" apiUrl = "https://api.useapi.net/v1/ltxstudio/assets/" headers = { "Authorization" : f"Bearer {token}" } params = { "email": email, "page": 1, "limit": 10, "filter": "images" } response = requests.get(apiUrl, headers=headers, params=params) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-scheduler-available === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-scheduler-available --- layout: default title: GET scheduler/available parent: LTX Studio API v1 nav_order: 510 --- ## Retrieve available capacity {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint retrieves information about available capacity and currently running API jobs. {: .get } > **https://api.useapi.net/v1/ltxstudio/scheduler/available** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Responses {% tabs scheduler_available_get_LtxStudio_v1_response %} {% tab scheduler_available_get_LtxStudio_v1_response 200 %} 200 OK ```json { "executing": [ { "jobId": "email:user1@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "email": "user1@example.com", "started": "2025-06-03T12:34:56.789Z", "elapsed": "03:45", "replyUrl": "https://example.com/webhook", "replyRef": "reference-id" } ], "available": [ { "email": "user1@example.com", "maxJobs": 5, "executing": 1, "available": 4 }, { "email": "user2@example.com", "maxJobs": 3, "executing": 0, "available": 3 } ] } ``` {% endtab %} {% tab scheduler_available_get_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional executing: { jobId: string email: string // Account email started: string // ISO timestamp of when the job started elapsed: string // Elapsed time in MM:SS format replyUrl: string // Webhook URL to notify when the job completes replyRef: string // Reference ID for the webhook }[] available: { email: string // LTX Studio account email maxJobs: number // Maximum number of concurrent jobs configured executing: number // Number of jobs currently executing available: number // Number of available job slots }[] } ``` ##### Examples {% tabs scheduler_available_get_LtxStudio_v1_example %} {% tab scheduler_available_get_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/scheduler/available" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab scheduler_available_get_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/scheduler/available"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab scheduler_available_get_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/scheduler/available" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-scheduler === Document URL: https://useapi.net/docs/api-ltxstudio-v1/get-ltxstudio-scheduler --- layout: default title: GET scheduler parent: LTX Studio API v1 nav_order: 500 --- ## Retrieve running jobs {: .no_toc } June 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint retrieves information about currently running API jobs. {: .get } > **https://api.useapi.net/v1/ltxstudio/scheduler** ##### Request Headers ``` yaml Authorization: Bearer {API token} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Responses {% tabs scheduler_get_LtxStudio_v1_response %} {% tab scheduler_get_LtxStudio_v1_response 200 %} 200 OK ```json [ { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "email": "user@example.com", "started": "2025-06-03T12:34:56.789Z", "elapsed": "03:45", "replyUrl": "https://example.com/webhook", "replyRef": "reference-id" }, { "jobId": "email:user@example.com-job:8b45c932-0ae1-316f-e32c-5bcd7g8940f8-type:video", "email": "user@example.com", "started": "2025-06-03T12:45:67.890Z", "elapsed": "02:34", "replyUrl": "https://example.com/webhook", "replyRef": "reference-id-2" } ] ``` {% endtab %} {% tab scheduler_get_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional jobId: string email: string // Account email started: string // ISO timestamp of when the job started elapsed: string // Elapsed time in MM:SS format replyUrl: string // Webhook URL to notify when the job completes replyRef: string // Reference ID for the webhook }[] ``` ##### Examples {% tabs scheduler_get_LtxStudio_v1_example %} {% tab scheduler_get_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/scheduler" \ -H "Accept: application/json" \ -H "Authorization: Bearer …" ``` {% endtab %} {% tab scheduler_get_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/scheduler"; const response = await fetch(apiUrl, { headers: { "Authorization": `Bearer ${token}`, }, }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab scheduler_get_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/scheduler" headers = { "Authorization" : f"Bearer {token}" } response = requests.get(apiUrl, headers=headers) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-accounts === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-accounts --- layout: default title: POST accounts parent: LTX Studio API v1 nav_order: 101 --- ## Create LTX Studio API account configuration {: .no_toc } June 3, 2025 (August 25, 2025) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- For your convenience, you can specify your LTX Studio configuration values under your LTX Studio account. If you specify multiple LTX Studio accounts, the API will automatically perform load balancing by randomly selecting an account with available capacity before making calls to LTX Studio. This endpoint creates or updates an API account configuration for LTX Studio. {: .post } > **https://api.useapi.net/v1/ltxstudio/accounts** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "cookie": "lt_id=user123; lt_token=eyJ...; lt_refresh_token=abc123...", "maxJobs": 20, } ``` - `cookie` is **required**, specify LTX Studio authentication cookies, see [Setup LTX Studio](../start-here/setup-ltxstudio) for details. - `maxJobs` is optional, and sets the maximum number of concurrent jobs. Currently, LTX Studio does not appear to have a limit on the number of concurrent generations, instead they noticeably slow down concurrent generations past ~10. Feel free to set this to higher values if needed. Supported values: 1…100, default is 20. ##### Responses {% tabs post_LtxStudio_v1_response %} {% tab post_LtxStudio_v1_response 200 %} 200 OK ```json { "email": "user@example.com", "cookie": { "lt_id": "…" "lt_token": "…secured…", "lt_refresh_token": "…secured…", }, "maxJobs": 20, "updated": 1678886400000, "updatedUTC": "YYYY-MM-DDTHH:MM:SS.sssZ", "tokenExpire": 1756197420000, "tokenExpireUTC": "YYYY-MM-DDTHH:MM:SS.sssZ", "refreshTokenExpire": 1694774400000, "refreshTokenExpireUTC": "YYYY-MM-DDTHH:MM:SS.sssZ" } ``` {% endtab %} {% tab post_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Missing required cookie fields: lt_token | lt_refresh_token", "code": 400 } ``` {% endtab %} {% tab post_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Subscription required", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional email: string cookie: { lt_id: string lt_token: string lt_refresh_token: string [key: string]: string } maxJobs: number updated: number tokenExpire: number updatedUTC?: string tokenExpireUTC?: string refreshTokenExpire?: number refreshTokenExpireUTC?: string error?: string } ``` ##### Examples {% tabs post_LtxStudio_v1_example %} {% tab post_LtxStudio_v1_example Curl %} ``` bash curl https://api.useapi.net/v1/ltxstudio/accounts \ -H "Accept: application/json" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "cookie": "lt_id=user123; lt_token=eyJ...; lt_refresh_token=abc123...", "maxJobs": 20 }' ``` {% endtab %} {% tab post_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/accounts"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "cookie": "lt_id=user123; lt_token=eyJ...; lt_refresh_token=abc123...", "maxJobs": 20 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/accounts" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } data = { "cookie": "lt_id=user123; lt_token=eyJ...; lt_refresh_token=abc123...", "maxJobs": 20 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-assets === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-assets --- layout: default title: POST assets parent: LTX Studio API v1 nav_order: 201 --- ## Upload asset to LTX Studio {: .no_toc } June 18, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint uploads an asset (image, video, audio, or other file) to your LTX Studio account. {: .post } > **https://api.useapi.net/v1/ltxstudio/assets/?…** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: {file MIME type} ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. - `Content-Type` is **required**, specify the MIME type of the file being uploaded ##### Query Parameters - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `type` is optional, specify the asset upload type. Supported values: * `image` is used by video generation endpoints [POST videos/ltx-create](../api-ltxstudio-v1/post-ltxstudio-videos-ltx-create) * `reference-image` is used by image generation endpoints [POST images/flux-edit](../api-ltxstudio-v1/post-ltxstudio-images-flux-edit), [POST images/flux-create](../api-ltxstudio-v1/post-ltxstudio-images-flux-create) and [POST videos/veo-create](../api-ltxstudio-v1/post-ltxstudio-videos-veo-create) Default is `image`. ##### Request Body Binary file content (image, video, audio, or other media file). ##### Responses {% tabs post_assets_LtxStudio_v1_response %} {% tab post_assets_LtxStudio_v1_response 200 %} 200 OK ```json { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/user-uploads/…", "expirationDateString": "1748919477350", "asset": { "type": "image", "fileId": "asset:3b18…-type:image/png", "mimeType": "image/png" } } ``` {% endtab %} {% tab post_assets_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab post_assets_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% endtabs %} ##### Model ```typescript { // TypeScript, all fields are optional assetUrl?: string expirationDateString?: string asset?: { type: string fileId: string mimeType: string } message?: string error?: string statusCode?: number } ``` ##### Examples {% tabs post_assets_LtxStudio_v1_example %} {% tab post_assets_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/assets/?email=user@example.com&type=image" \ -H "Authorization: Bearer …" \ -H "Content-Type: image/png" \ --data-binary @image.png ``` {% endtab %} {% tab post_assets_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const email = "user@example.com"; const file = document.getElementById('fileInput').files[0]; const apiUrl = `https://api.useapi.net/v1/ltxstudio/assets/?email=${email}&type=image`; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": file.type, }, body: file }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_assets_LtxStudio_v1_example Python %} ``` python import requests token = "API token" email = "user@example.com" apiUrl = "https://api.useapi.net/v1/ltxstudio/assets/" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "image/png" } params = { "email": email, "type": "image" } with open("image.png", "rb") as f: response = requests.post(apiUrl, headers=headers, params=params, data=f) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-flux-create === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-flux-create --- layout: default title: POST images/create parent: LTX Studio API v1 nav_order: 402 --- ## Create images with AI models {: .no_toc } June 3, 2025 (October 3, 2025) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint creates new images using [FLUX.1 Kontext](https://bfl.ai/models/flux-kontext), [FLUX.1 Kontext Max](https://bfl.ai/models/flux-kontext), or [Nano Banana / Gemini 2.5 Flash Image](https://deepmind.google/technologies/gemini/flash/) from text prompts with optional reference images. ##### Model Capabilities | Parameter | [FLUX.1 Kontext](https://bfl.ai/models/flux-kontext)
`flux` (default) | [FLUX.1 Kontext Max](https://bfl.ai/models/flux-kontext)
`flux-premium` | [Nano Banana / Gemini 2.5 Flash Image](https://deepmind.google/technologies/gemini/flash/)
`nano-banana` | |-----------|:---:|:---:|:---:| | `referenceAssetId` | ✓ | ✗ | ✗ | | `reference_strength` | ✓ | ✗ | ✗ | | `style` | ✓ | ✗ | ✗ | {: .post } > **https://api.useapi.net/v1/ltxstudio/images/create** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "prompt": "A serene mountain landscape at sunset", "aspectRatio": "16:9", "style": "cinematic", "shotType": "wide shot", "shotAngle": "eye-level", "seed": 123456 } ``` - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `prompt` is **required**, text description for image generation (max 2000 characters) - `location` is optional, location description for the image (max 2000 characters). - `weather` is optional, weather conditions description (max 2000 characters). - `lighting` is optional, lighting description (max 2000 characters). - `aspectRatio` is optional, output image aspect ratio. Supported values: `16:9`, `9:16`, `1:1`. Default: `16:9`. - `referenceAssetId` is optional, asset ID for reference image to influence generation (see model capabilities table above). Use field `fileId` from [POST assets/?type=reference-image](../api-ltxstudio-v1/post-ltxstudio-assets) or [GET assets/?filter=images](../api-ltxstudio-v1/get-ltxstudio-assets). - `reference_strength` is optional, strength of reference image influence 0-100 (see model capabilities table above). Default: `50`. - `style` is optional, image style to apply (see model capabilities table above). Supported values: `cinematic`, `vintage`, `low_key`, `indy`, `y2k`, `pop`, `grunge`, `dreamy`, `hand_drawn`, `2d_novel`, `boost`, `scribble`, `film_noir`, `anime`, `3d_cartoon`, `colored`. Default: `base` (no style). - `shotType` is optional, type of shot for the image (e.g., "wide shot", "close-up", "medium shot"). - `shotAngle` is optional, camera angle for the shot. Supported values: `eye-level`, `low-angle`, `over-the-shoulder`, `overhead`, `birds-eye-view`. - `seed` is optional, random seed for reproducible results. - `model` is optional, the AI model to use for image generation. Supported values: `flux`, `flux-premium`, `nano-banana`. Default: `flux`. - `pollForResult` is optional, number of polling attempts to wait for completion (each attempt waits 3 seconds, up to 60 seconds total max) before sending job to the scheduler. For example, `pollForResult: 5` will poll every 3 seconds for up to 15 seconds total. Supported values: `1`-`20`. Default: immediate return with `jobId`. - `maxJobs` is optional, override the default maximum number of concurrent jobs. - `replyUrl` is optional, webhook URL for job completion notifications. See [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId#model) for response model. - `replyRef` is optional, custom reference for webhook identification. ##### Responses {% tabs post_images_flux_create_LtxStudio_v1_response %} {% tab post_images_flux_create_LtxStudio_v1_response 200 (Job ID) %} 200 OK (Job Created) ```json { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "generationId": "gen_abc123def456" } ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_response 200 (Completed) %} 200 OK (pollForResult completed) ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/vertex-ai/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:image/png", "mimeType": "image/png", "artifactSubtype": "vertex-ai" } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback", "code": 200 } ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Insufficient credits", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model Use [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId) to retrieve job status and results if they were not provided with the response. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string generationId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs post_images_flux_create_LtxStudio_v1_example %} {% tab post_images_flux_create_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/images/create" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene mountain landscape at sunset", "aspectRatio": "16:9", "style": "cinematic", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 }' ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/images/create"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "prompt": "A serene mountain landscape at sunset", "aspectRatio": "16:9", "style": "cinematic", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_images_flux_create_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/images/create" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "application/json" } data = { "prompt": "A serene mountain landscape at sunset", "aspectRatio": "16:9", "style": "cinematic", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-flux-edit === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-flux-edit --- layout: default title: POST images/edit parent: LTX Studio API v1 nav_order: 401 --- ## Edit images with AI models {: .no_toc } June 3, 2025 (October 3, 2025) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint edits existing images using [FLUX.1 Kontext](https://bfl.ai/models/flux-kontext), [FLUX.1 Kontext Max](https://bfl.ai/models/flux-kontext), or [Nano Banana / Gemini 2.5 Flash Image](https://deepmind.google/technologies/gemini/flash/) based on text prompts and reference images. ##### Model Capabilities | Parameter | [FLUX.1 Kontext](https://bfl.ai/models/flux-kontext)
`flux` (default) | [FLUX.1 Kontext Max](https://bfl.ai/models/flux-kontext)
`flux-premium` | [Nano Banana / Gemini 2.5 Flash Image](https://deepmind.google/technologies/gemini/flash/)
`nano-banana` | |-----------|:---:|:---:|:---:| | `referenceAssetId` | ✓ | ✓ | ✓ | | `referenceAssetId2` | ✓ | ✓ | ✓ | | `referenceAssetId3` | ✗ | ✓ | ✓ | | `aspectRatio` | ✓ | ✓ | ✗ | {: .post } > **https://api.useapi.net/v1/ltxstudio/images/edit** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "prompt": "Add golden sunset lighting to the landscape", "referenceAssetId": "asset:3b18…-type:image/png", "aspectRatio": "16:9", "shotType": "wide shot", "shotAngle": "eye-level", "seed": 123456 } ``` - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `prompt` is **required**, text description for image editing (max 2000 characters) - `referenceAssetId` is **required**, asset ID for the source image to edit. Use field `fileId` from [POST assets/?type=reference-image](../api-ltxstudio-v1/post-ltxstudio-assets) or [GET assets/?filter=images](../api-ltxstudio-v1/get-ltxstudio-assets). - `referenceAssetId2` is optional, second reference image asset ID. - `referenceAssetId3` is optional, third reference image asset ID (see model capabilities table above). - `location` is optional, location description for the image (max 2000 characters). - `weather` is optional, weather conditions description (max 2000 characters). - `lighting` is optional, lighting description (max 2000 characters). - `aspectRatio` is optional, output image aspect ratio (see model capabilities table above). Supported values: `16:9`, `9:16`, `1:1`. Default: `16:9`. - `shotType` is optional, type of shot for the image (e.g., "wide shot", "close-up", "medium shot"). - `shotAngle` is optional, camera angle for the shot. Supported values: `eye-level`, `low-angle`, `over-the-shoulder`, `overhead`, `birds-eye-view`. - `seed` is optional, random seed for reproducible results. - `model` is optional, the AI model to use for image editing. Supported values: `flux`, `flux-premium`, `nano-banana`. Default: `flux`. - `pollForResult` is optional, number of polling attempts to wait for completion (each attempt waits 3 seconds, up to 60 seconds total max) before sending job to the scheduler. For example, `pollForResult: 5` will poll every 3 seconds for up to 15 seconds total. Supported values: `1`-`20`. Default: immediate return with `jobId`. - `maxJobs` is optional, override the default maximum number of concurrent jobs. - `replyUrl` is optional, webhook URL for job completion notifications. See [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId#model) for response model. - `replyRef` is optional, custom reference for webhook identification. ##### Responses {% tabs post_images_flux_edit_LtxStudio_v1_response %} {% tab post_images_flux_edit_LtxStudio_v1_response 200 (Job ID) %} 200 OK (Job Created) ```json { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "generationId": "gen_abc123def456" } ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_response 200 (Completed) %} 200 OK (pollForResult completed) ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/vertex-ai/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:image/png", "mimeType": "image/png", "artifactSubtype": "vertex-ai" } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback", "code": 200 } ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Insufficient credits", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model Use [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId) to retrieve job status and results if they were not provided with the response. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string generationId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs post_images_flux_edit_LtxStudio_v1_example %} {% tab post_images_flux_edit_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/images/edit" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Add golden sunset lighting to the landscape", "referenceAssetId": "asset:3b18…-type:image/png", "aspectRatio": "16:9", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 }' ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/images/edit"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "prompt": "Add golden sunset lighting to the landscape", "referenceAssetId": "asset:3b18…-type:image/png", "aspectRatio": "16:9", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_images_flux_edit_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/images/edit" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "application/json" } data = { "prompt": "Add golden sunset lighting to the landscape", "referenceAssetId": "asset:3b18…-type:image/png", "aspectRatio": "16:9", "shotType": "wide shot", "shotAngle": "eye-level", "pollForResult": 10 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-upscale === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-images-upscale --- layout: default title: POST images/upscale parent: LTX Studio API v1 nav_order: 403 --- ## Upscale generated images {: .no_toc } October 3, 2025 ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint upscales previously generated images to higher resolution. {: .post } > **https://api.useapi.net/v1/ltxstudio/images/upscale** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image" } ``` - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `jobId` is **required**, the job ID from a previously completed image generation job. Use the `jobId` field from [POST images/edit](../api-ltxstudio-v1/post-ltxstudio-images-flux-edit) or [POST images/create](../api-ltxstudio-v1/post-ltxstudio-images-flux-create) response. - `pollForResult` is optional, number of polling attempts to wait for completion (each attempt waits 3 seconds, up to 60 seconds total max) before sending job to the scheduler. For example, `pollForResult: 5` will poll every 3 seconds for up to 15 seconds total. Supported values: `1`-`20`. Default: immediate return with `jobId`. - `maxJobs` is optional, override the default maximum number of concurrent jobs. - `replyUrl` is optional, webhook URL for job completion notifications. See [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId#model) for response model. - `replyRef` is optional, custom reference for webhook identification. ##### Responses {% tabs post_images_upscale_LtxStudio_v1_response %} {% tab post_images_upscale_LtxStudio_v1_response 200 (Job ID) %} 200 OK (Job Created) ```json { "jobId": "email:user@example.com-job:8b45c932-0fe1-316f-e32c-5bcd7g8940f8-type:image", "generationId": "gen_xyz789abc012" } ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_response 200 (Completed) %} 200 OK (pollForResult completed) ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/vertex-ai/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:4c29…-type:image/png", "mimeType": "image/png", "artifactSubtype": "vertex-ai" } } }, "jobId": "email:user@example.com-job:8b45c932-0fe1-316f-e32c-5bcd7g8940f8-type:image", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback", "code": 200 } ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Insufficient credits", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model Use [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId) to retrieve job status and results if they were not provided with the response. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string generationId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs post_images_upscale_LtxStudio_v1_example %} {% tab post_images_upscale_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/images/upscale" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "pollForResult": 10 }' ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/images/upscale"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "pollForResult": 10 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_images_upscale_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/images/upscale" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "application/json" } data = { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:image", "pollForResult": 10 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-videos-ltx-create === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-videos-ltx-create --- layout: default title: POST videos/ltx-create parent: LTX Studio API v1 nav_order: 300 --- ## Create video using LTX models {: .no_toc } June 3, 2025 (August 25, 2025) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint creates a video using LTX Studio's LTX models (LTX-Video) from image inputs. {: .post } > **https://api.useapi.net/v1/ltxstudio/videos/ltx-create** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "ltxv-turbo", "duration": "3", "aspectRatio": "16:9", "intensity": "medium", "seed": 123456, "audioSFX": true } ``` - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `prompt` is **required**, text description for video generation (max 2000 characters) - `startAssetId` is optional, asset ID for the starting frame. Use field `fileId` from [POST assets](../api-ltxstudio-v1/post-ltxstudio-assets) or [GET assets/?filter=images](../api-ltxstudio-v1/get-ltxstudio-assets). - `endAssetId` is optional, asset ID for the ending frame. Use field `fileId` from [POST assets](../api-ltxstudio-v1/post-ltxstudio-assets) or [GET assets/?filter=images](../api-ltxstudio-v1/get-ltxstudio-assets). - `model` is optional, LTX model to use. Supported values: `ltxv`, `ltxv-turbo`. Default is `ltxv-turbo`. - `duration` is optional, video duration in seconds. Supported values: `3`, `5`, `7`, `9`, `15`, `30`. Default is `3`. - `aspectRatio` is optional, video aspect ratio. Supported values: `16:9`, `9:16`, `1:1`. Default is `16:9`. - `intensity` is optional, motion intensity level. Supported values: `low`, `medium`, `high`. Default is `medium`. - `seed` is optional, random seed for reproducible results. Default is random. - `audioSFX` is optional, enable automatic sound effects generation. Default is `false`. - `pollForResult` is optional, number of polling attempts to wait for completion (each attempt waits 3 seconds, up to 60 seconds total max) before sending job to the scheduler. For example, `pollForResult: 5` will poll every 3 seconds for up to 15 seconds total. Supported values: 1-20. Default is immediate return with jobId. - `maxJobs` is optional, override the default maximum number of concurrent jobs. - `replyUrl` is optional, webhook URL for job completion notifications. See [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId#model) for response model. - `replyRef` is optional, custom reference for webhook identification. **Note**: Either `startAssetId` or `endAssetId` (or both) must be provided. ##### Responses {% tabs post_videos_ltx_LtxStudio_v1_response %} {% tab post_videos_ltx_LtxStudio_v1_response 200 (Job ID) %} 200 OK (Job Created) ```json { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video", "generationId": "gen_abc123def456" } ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_response 200 (Completed) %} 200 OK (pollForResult completed) ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/model-serving/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:video/mp4", "mimeType": "video/mp4", "artifactSubtype": "model-serving" } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback", "code": 200 } ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "startAssetId or endAssetId is required", "code": 400 } ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Insufficient credits", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model Use [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId) to retrieve job status and results if they were not provided with the response. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string generationId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs post_videos_ltx_LtxStudio_v1_example %} {% tab post_videos_ltx_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/videos/ltx-create" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "ltxv-turbo", "duration": "3", "aspectRatio": "16:9", "intensity": "medium", "audioSFX": true, "pollForResult": 10 }' ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/videos/ltx-create"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "ltxv-turbo", "duration": "3", "aspectRatio": "16:9", "intensity": "medium", "audioSFX": true, "pollForResult": 10 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_videos_ltx_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/videos/ltx-create" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "application/json" } data = { "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "ltxv-turbo", "duration": "3", "aspectRatio": "16:9", "intensity": "medium", "audioSFX": True, "pollForResult": 10 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-videos-veo-create === Document URL: https://useapi.net/docs/api-ltxstudio-v1/post-ltxstudio-videos-veo-create --- layout: default title: POST videos/veo-create parent: LTX Studio API v1 nav_order: 301 --- ## Create video using Veo2 and Veo3 models {: .no_toc } June 18, 2025 (August 25, 2025) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- This endpoint creates a video using Google's Veo models. | Parameter | Veo2 (image+text to video) | Veo3 (image+text to video) | Veo3-Fast (text to video) | |---------------|------------------------------|----------------------------|---------------------------| | prompt | Optional | Optional | Optional | | startAssetId | **Required** | Optional | Optional | | duration, sec | `5` (default), `6`, `7`, `8` | `8` (default) | `8` (default) | | aspectRatio | `16:9` (default), `9:16` | `16:9` (default) | `16:9` (default) | | audioSFX | Optional | Optional | Optional | | resolution | not supported (720p) | `720p`/`1080p` (default) | `720p`/`1080p` (default) | {: .post } > **https://api.useapi.net/v1/ltxstudio/videos/veo-create** ##### Request Headers ``` yaml Authorization: Bearer {API token} Content-Type: application/json # Alternatively you can use multipart/form-data # Content-Type: multipart/form-data ``` - `API token` is **required**, see [Setup useapi.net](../start-here/setup-useapi) for details. ##### Request Body ``` json { "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "veo2", "duration": "5", "aspectRatio": "16:9", "audioSFX": true, "seed": 123456 } ``` - `email` is optional when only one [account](../api-ltxstudio-v1/get-ltxstudio-accounts) configured. However, if you have multiple accounts configured, this parameter becomes **required**. - `model` is optional, Veo model to use. Supported values: `veo2`, `veo3`, `veo3-fast`. Default is `veo2`. - `prompt` is optional, text description for video generation (max 2000 characters) - `startAssetId` is optional, asset ID for the starting frame. Use field `fileId` from [POST assets/?type=reference-image](../api-ltxstudio-v1/post-ltxstudio-assets) or [GET assets/?filter=images](../api-ltxstudio-v1/get-ltxstudio-assets). - `duration` is optional, video duration in seconds. - `aspectRatio` is optional, video aspect ratio. - `audioSFX` is optional, enable automatic sound effects generation. Available for all models. For `veo2`, generates separate audio track. For `veo3` and `veo3-fast`, controls whether to include audio in video generation. Default is `false`. - `resolution` is optional, available for `veo3` and `veo3-fast`. Supported values: `720p`, `1080p` (default). - `seed` is optional, random seed for reproducible results. Default is random. - `pollForResult` is optional, number of polling attempts to wait for completion (each attempt waits 3 seconds, up to 60 seconds total max) before sending job to the scheduler. For example, `pollForResult: 5` will poll every 3 seconds for up to 15 seconds total. Supported values: 1-20. Default is immediate return with jobId. - `maxJobs` is optional, override the default maximum number of concurrent jobs. - `replyUrl` is optional, webhook URL for job completion notifications. See [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId#model) for response model. - `replyRef` is optional, custom reference for webhook identification. ##### Responses {% tabs post_videos_veo_LtxStudio_v1_response %} {% tab post_videos_veo_LtxStudio_v1_response 200 (Job ID) %} 200 OK (Job Created) ```json { "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video", "generationId": "gen_abc123def456" } ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_response 200 (Completed) %} 200 OK (pollForResult completed) ```json { "status": { "type": "completed", "progress": 100, "artifact": { "assetUrl": "https://storage.googleapis.com/lt-infinity-prd/artifacts/vertex-ai/…", "expirationDateString": "1748919477350", "asset": { "type": "artifact", "fileId": "asset:3b18…-type:video/mp4", "mimeType": "video/mp4", "artifactSubtype": "vertex-ai" } } }, "jobId": "email:user@example.com-job:7a34b821-9fd0-205e-d21b-4abc6f7839e7-type:video", "replyRef": "custom-reference-123", "replyUrl": "https://webhook.example.com/ltx-callback", "code": 200 } ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_response 400 %} 400 Bad Request ```json { "error": "Error message", "code": 400 } ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_response 401 %} 401 Unauthorized ```json { "error": "Unauthorized", "code": 401 } ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_response 402 %} 402 Payment Required ```json { "error": "Insufficient credits", "code": 402 } ``` {% endtab %} {% endtabs %} ##### Model Use [GET assets/`jobId`](../api-ltxstudio-v1/get-ltxstudio-assets-jobId) to retrieve job status and results if they were not provided with the response. ```typescript { // TypeScript, all fields are optional status: { type: 'active' | 'completed' | 'failed' progress?: number message?: string artifact?: { assetUrl: string expirationDateString: string asset: { type: string fileId: string mimeType: string artifactSubtype: string } } } jobId?: string generationId?: string replyRef?: string replyUrl?: string code?: number } ``` ##### Examples {% tabs post_videos_veo_LtxStudio_v1_example %} {% tab post_videos_veo_LtxStudio_v1_example Curl %} ``` bash curl "https://api.useapi.net/v1/ltxstudio/videos/veo-create" \ -H "Authorization: Bearer …" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "veo3-fast", "audioSFX": true, "pollForResult": 10 }' ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_example JavaScript %} ``` javascript const token = "API token"; const apiUrl = "https://api.useapi.net/v1/ltxstudio/videos/veo-create"; const response = await fetch(apiUrl, { method: "POST", headers: { "Authorization": `Bearer ${token}`, "Content-Type": "application/json", }, body: JSON.stringify({ "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "veo3-fast", "audioSFX": true, "pollForResult": 10 }) }); const result = await response.json(); console.log("response", {response, result}); ``` {% endtab %} {% tab post_videos_veo_LtxStudio_v1_example Python %} ``` python import requests token = "API token" apiUrl = "https://api.useapi.net/v1/ltxstudio/videos/veo-create" headers = { "Authorization" : f"Bearer {token}", "Content-Type": "application/json" } data = { "prompt": "A serene landscape with flowing water", "startAssetId": "asset:3b18…-type:image/png", "model": "veo3-fast", "audioSFX": True, "pollForResult": 10 } response = requests.post(apiUrl, headers=headers, json=data) print(response, response.json()) ``` {% endtab %} {% endtabs %} === URL: https://useapi.net/docs/questions-and-answers === Document URL: https://useapi.net/docs/questions-and-answers --- title: Q&A nav_order: 110000 layout: home --- # Questions and Answers {: .no_toc } 4 min read • September 2023 (January 14, 2026) ## Table of contents {: .no_toc .text-delta } 1. TOC {:toc} --- ### How to avoid Midjourney bans? Using automation is against Discord and Midjourney's Terms of Service, so you need to plan accordingly and have backup account(s) ready. * The best practice is to create several new Discord accounts and join the Midjourney Discord server. These accounts should be used exclusively for API work and nothing else. We strongly recommend using a VPN to prevent your personal data/IP addresses from being leaked. You can use the [Opera](https://www.opera.com/download) browser with built-in VPN or the [Brave](https://brave.com/download) browser with [Tor support](https://support.brave.com/hc/en-us/articles/360018121491-What-is-a-Private-Window-with-Tor-Connectivity). * Brand new/fresh Discord accounts have a significantly higher chance of being banned when running high Midjourney generation loads. Consider purchasing aged Discord accounts (2-3 years old) from marketplaces like [z2u.com](https://www.z2u.com/) for around $1-3 each. Aged accounts appear more legitimate and are less likely to trigger automated bans. * When creating accounts in bulk, make sure to restart Opera/Brave so that your IP is different every time, since Discord tracks and records the IP addresses used to create new accounts. Make sure to log in to the Discord accounts designated for API use through a VPN. When creating new email and Discord accounts, use names closely resembling real names - something that does not look suspicious. * Once a Discord account is created, join the Midjourney Discord [server](https://discord.com/invite/midjourney) and follow the [instructions](https://useapi.net/docs/start-here/setup-midjourney) to create your own server and invite the Midjourney bot. If you're planning to use this account, you can proceed with a Midjourney subscription. It's a good idea to create several Discord accounts with the Midjourney setup, as described above early on, this will *"age"* them and make them less suspicious later on when you need to subscribe to Midjourney. * When paying for a Midjourney subscription use a virtual credit card number (provided by most major credit card companies) or services like [Privacy.com](https://privacy.com). Make sure to use a credit card name and address that resemble an actual address and name. Use a *different name and address* for every new Midjourney subscription. Midjourney has access to all payment details and will cross-check banned accounts' payment information to ban newly created accounts if a match is found. * If your account gets banned, file a charge dispute with your credit card company. Since Midjourney cannot produce any evidence of you violating the ToS, the bank will fully refund your payment. Our customers have reported a 100% success rate of getting their money back, though it may take some time. * When using the API, try to simulate real users. Avoid running generations 24/7 by establishing quiet hours (for example, you can use two or three accounts and rotate them every 12/8 hours). Midjourney seems to specifically target accounts with a large number of `--relax` usage, so try to limit those generations to a reasonable number (<300 generations/day). If you heavily rely on `--relax`, execute at least one fast generation for every NN relax generations. * Do not post public links to Discord/Midjourney CDN attachments, they contain your Discord account number and can be used to trace back to your account. * Sharing cross-account `--p` codes is not safe. You risk all accounts using the same `--p` codes being banned by Midjourney. * Do not run multiple requests with the same or similar prompts (e.g., "My test prompt 1", "My test prompt 2", and so on). Midjourney analyzes prompts and will force your Discord account token to expire when this kind of situation is detected. You will have to reset your Discord password manually before you can continue operating. * Adjust [maxJobs](../docs/api-v2/post-account-midjourney) parameter to be one less than the maximum possible. For example, for the [Pro Plan](https://docs.midjourney.com/docs/plans) with a maximum of 12 concurrent jobs, set `maxJobs` to 11 or even 10. * If you ever receive a [504](../docs/api-v2/post-jobs-imagine#responses) response code, it means your `maxJobs` is set to a value higher than your account plan supports. Adjust it accordingly. * Finally, monitor for [596](../docs/api-v2/post-jobs-imagine#responses) response codes and ensure you check your API email. The API will proactively warn you if you have pending moderation messages or if Midjourney issues a CAPTCHA request. ### How to avoid Runway account suspension? Using automation is against Runway's Terms of Service, so you need to plan accordingly and have backup account(s) ready. * The best practice is to create several stand-by Runway accounts. These accounts should be used exclusively for API work and nothing else. We strongly recommend using a VPN to prevent your personal data/IP addresses from being leaked. You can use the [Opera](https://www.opera.com/download) browser with a built-in VPN or the [Brave](https://brave.com/download) browser with [Tor support](https://support.brave.com/hc/en-us/articles/360018121491-What-is-a-Private-Window-with-Tor-Connectivity). * When creating accounts in bulk, make sure to restart Opera/Brave so that your IP is different every time. When creating new emails and Runway accounts, use names that closely resemble real names—something that does not look suspicious. * Once a new Runway account is created, you will have a few free credits with which you can test the API. After testing, log out and leave the account alone until you are ready to activate the [Unlimited plan](https://runwayml.com/pricing) (the only subscription plan that makes sense to pay for). * When paying for a Runway subscription, use a virtual credit card number (provided by most major credit card companies) or services like [Privacy.com](https://privacy.com). Make sure to use a credit card name and address that resemble an actual name and address. Use a *different name and address* for every new Runway subscription. Runway has access to all payment details and can cross-check banned accounts' payment information to ban newly created accounts if a match is found. * If your account gets suspended, file a charge dispute with your credit card company. Since Runway cannot produce any evidence of you violating the ToS, the bank will fully refund your payment. Our customers have reported a 100% success rate of getting their money back, though it may take some time. * When using the API, try to simulate real users. Avoid running generations 24/7 by establishing quiet hours (for example, you can use two or three accounts and rotate them every 12 to 8 hours). Avoid calling API endpoints too frequently, and consider using the `replyUrl` webhook to retrieve results, as this will ensure the least intrusive operation. * Finally, monitor your API email—the one you used to subscribe to useapi.net services. The API will proactively warn you if your Runway account has any issues. ### Do you validate a user's text/image prompts to ensure they are passing AI services' safety requirements? It is common practice for AI services to ban users for violating prompt guidelines (for example, see Midjourney PG13 [requirements](https://docs.midjourney.com/docs/community-guidelines)). Our API does not perform any prompt pre-validations, it will return a [422](../docs/api-v2/post-jobs-imagine#responses) status code if the job is moderated by Midjourney, and similar checks apply for the other AI APIs we offer. Generally speaking, if you're planning to use the API for a public Telegram bot (which is one of the popular use cases) or in similar scenarios where you do not control the quality of the prompt, it might be a good idea to use a combination of a ban/stop word list along with [OpenAI ChatGPT](https://openai.com/api/pricing) or [Google Gemini](https://ai.google.dev/pricing) to check if the prompts meet safety requirements. [Gemini](https://ai.google.dev/pricing) offers a free tier with some RPM (requests per minute) limitations. We also offer LLM models, specifically `MiniMax-Text-01`, a fast instructional multimodal model that is free to use and can validate both text and images for safety. Please see [POST minimax/llm](../docs/api-minimax-v1/post-minimax-llm). ### How is your experimental Runway API different from the official Runway API? Official [Runway API](https://docs.dev.runwayml.com) currently only supports Gen-3 Alpha Turbo. The cost for Gen-3 Alpha Turbo 10-second generation is [$0.50](https://docs.dev.runwayml.com/usage/billing). Our [experimental Runway API](https://useapi.net/docs/api-runwayml-v1) is a reverse-engineered version of [runwayml.com](https://runwayml.com). It fully supports **all** features of Gen-3 Alpha, Gen-3 Alpha Turbo, Act-One, Video to Video, Super-Slow Motion, Gen-2, the LipSync feature, and [more](https://useapi.net/docs/api-runwayml-v1). When used along with the Runway [Unlimited plan](https://runwayml.com/pricing), it allows you to run several hundred generations each day. On average, you can expect the following numbers for Gen-3 Alpha Turbo 10-second generation: - 1 generation is completed within 25 seconds - 10 generations take about 4 minutes to complete - 30 generations take about 12 minutes to complete - 150 generations take about one hour to complete If you generate 200+ videos, the official API will cost you $0.50 per generation, so 200 generations cost about $100. This means the $95 [Unlimited plan](https://runwayml.com/pricing), combined with our $15/month subscription, will pay for itself by the **first day**, most often within the first few hours. We provide an API for all the features available at [runwayml.com](https://runwayml.com), including Gen-3 Alpha, Act-One, video-to-video (with extend and expand), Frames, and many more. The official Runway API only supports [Gen-3 Alpha Turbo](https://docs.dev.runwayml.com/). ### How is your experimental MiniMax API different from the official MiniMax API? Official [MiniMax API](https://intl.minimaxi.com/document/video_generation) costs $0.43…$0.65 [link](https://www.minimaxi.com/en/price) per single 6-second-long generation. Our [experimental MiniMax API](https://useapi.net/docs/api-minimax-v1) is a reverse-engineered version of the MiniMax/HailuoAI websites. It does not cost you anything to generate as many videos as you wish, thanks to a flat monthly [subscription](https://useapi.net/docs/subscription) fee. You can link as many [paid](https://hailuoai.video/subscribe) or free MiniMax/HailuoAI accounts to our API as you wish. With [Unlimited](https://hailuoai.video/subscribe) Hailuo AI plan or [Standard](https://hailuoai.video/subscribe) plan for first day, you can expect the following numbers: - 1 generation completed within 2 minutes - 10 generations take about 20 minutes to complete - 30 generations take about an hour to complete If you generate 250+ videos, the official API will cost you $0.43 per generation, so 250 generations total about $107.50. This means the $95 [Unlimited](https://hailuoai.video/subscribe) plan, combined with our $15/month subscription, will pay for itself by the **first day**. When using free [hailuoai.video](https://hailuoai.video) account, it costs one credit to generate a single image, and you can generate up to four images at once. With a daily free top-up of 100 credits, a free hailuoai.video account can generate 100 images per day – up to 3K images per month. ### Do you support [n8n](https://n8n.io) workflow automation? Please consider the [n8n-nodes-useapi](https://github.com/lvalics/n8n-nodes-useapi) package by [lvalics](https://github.com/lvalics). ### How POST raw content to [runwayml/assets](https://useapi.net/docs/api-runwayml-v1/post-runwayml-assets) and [minimax/files](https://useapi.net/docs/api-minimax-v1/post-minimax-files) using Make.com and similar nocode tools? We recommend using module called [0codekit](https://www.make.com/en/integrations/onesaas) to run JavaScript and return a result.
0codekit JavaScript example ```js async function fetchFromURLandPOST(imageURL, name) { const apiToken = ""; // https://useapi.net/docs/start-here/setup-useapi // Runway https://useapi.net/docs/api-runwayml-v1/post-runwayml-assets const apiUrl = `https://api.useapi.net/v1/runwayml/assets/?name=${name}`; // MiniMax https://useapi.net/docs/api-minimax-v1/post-minimax-files // const apiUrl = `https://api.useapi.net/v1/minimax/files/`; try { // Fetch the image from the URL const responseImage = await fetch(imageURL); if (!responseImage.ok) throw new Error(`Failed to fetch ${imageURL}: ${responseImage.statusText}`); // Convert the response to a Blob const blob = await responseImage.blob(); // Prepare headers for the POST request const headers = { "Authorization": `Bearer ${apiToken}`, "Content-Type": blob.type, }; // Make the POST request with the blob as the body const response = await fetch(apiUrl, { method: "POST", headers: headers, body: blob, }); const result = await response.json(); return { data: result }; } catch (error) { return { error: error.message }; } } // Calling the function result = await fetchFromURLandPOST("https:\\website.com\image.jpeg", "my_image"); ```