letzai-api
Generate AI images and videos via the LetzAI API. Images with Nano Banana Pro, Seedream 5, Flux 2, GPT Image 2; videos with Veo 3.1, Kling V3, Seedance 2.0. Includes context editing, upscaling, asset uploads, and custom @model training. Use for content creation apps and automation.
By letz-ai · 910 installs
npx skills add letz-ai/letzai-skill --skill letzai-api
Source repository · Upstream listing
LetzAI API Integration Skill
Overview
Helps you integrate the LetzAI public API for AI image and video generation, editing,
upscaling, asset uploads, and custom model (LoRA) training. Custom trained models for
persons, objects and styles are referenced inside prompts with @modelname .
Authentication
Base URL: https://api.letz.ai
Auth: Authorization: Bearer YOUR API KEY
Get an API key: [letz.ai/subscription](https://letz.ai/subscription)
Swagger (source of truth): [api.letz.ai/doc](https://api.letz.ai/doc) — machine readable at /doc json and /doc yaml
Do not confuse the public API with the private one. https://api.letz.ai is the
public developer API described here. https://private api.letz.ai powers the LetzAI web
app and has different route names ( /upscales , /image completions , /video edits ).
Those routes 404 on the public API.
Unknown field rejection
The API validates request bodies strictly. Sending a field that is not in the schema
returns 400 . In particular there is no negativePrompt , seed or aspectRatio on
POST /images — aspect ratio is expressed via width / height .
Core Workflows
1. Image Generation — POST /images
Parameter Type Default Notes
prompt string — Required. May contain @modelname tags.
baseModel string account default See model table below.
mode string model default Resolution tier — allowed values differ per model.
width int 1600 480–2160
height int 1600 480–2160
quality int 2 1–6
creativity int 2 1–6
hasWatermark bool true
systemVersion int account default 2 or 3
hideFromUserProfile bool false
webhookUrl string — POSTed when the job finishes.
organizationId UUID — Bill credits to an org you belong to.
Image models
mode is the resolution tier , and the accepted values are model specific.
Model baseModel mode values Credits (generate) Credits (edit)
Nano Banana Pro (Google) gemini 3 pro image default (1K) · 2k (HD) · 4k 80 / 160 / 240 80 / 160 / 240
Nano Banana 2 (Google) nbf inferencesh default (1K) · 2k (HD) · 4k 40 / 80 / 160 50 / 100 / 150
Nano Banana 2 Lite (Google) nano banana 2 lite default (1K) 20 25
Seedream 5 Pro (ByteDance) seedream 5 0 pro 2k (HD) · 4k 80 / 160 80 / 160
Seedream 4.5 (ByteDance) seedream 4 5 251128 2k (HD) · 4k 80 / 160 80 / 160
Flux 2 (Black Forest Labs) flux2 1k · hd 60 / 120 60 / 120
GPT Image 2 (OpenAI) gpt image 2 1k · hd · 4k 160 / 240 / 480 160 / 240 / 480
WAN 2.7 Image Pro (Alibaba) wan 2 7 image pro 1k · 2k 10 10
Aliases are accepted, e.g. gemini 3 pro image preview still resolves to Nano Banana Pro.
The live catalogue with pricing lives at [letz.ai/docs/models.json](https://letz.ai/docs/models.json).
Workflow
1. POST /images
2. Read id from the response
3. Poll GET /images/{id} every 3 s
4. On status === "ready" , read imageVersions.original
See [examples/image generation.js](examples/image generation.js).
2. Video Generation — POST /videos
Parameter Type Notes
prompt string Required.
originalImageCompletionId UUID Animate a previously generated LetzAI image.
imageUrl string Animate a public image URL.
imageUrls string[] Multi frame: [0] = first frame, [1] = last frame.
prompts object[] Multi shot storyboards ( video kling3 ): [{ prompt, duration }] .
baseModel string Optional; settings.mode is the usual selector.
width / height / resolution number Optional output sizing.
settings object Model + duration + audio (below).
webhookUrl string
hidePrompt bool
organizationId UUID
Image input is optional — omit all of originalImageCompletionId / imageUrl /
imageUrls for pure text to video.
settings
Field Notes
mode Video model key — see table.
duration Seconds, clamped to the model's allowed values.
withSound Enable native audio where supported.
highQuality Higher resolution tier; usually doubles the price.
resolution "720p" , "1080p" , "4k" for per second priced models.
Video models
Use the video prefixed key as settings.mode .
Model settings.mode Duration Credits
Google Veo 3.1 video veo31 8 s (fixed) 1500 · ×2 with audio · ×2 at 1080p
Kling V3 video kling3 3–15 s 150 · 300 with audio
Kling V2.6 video kling26 5 or 10 s 150 · ×2 with audio · ×2 at 1080p
WAN 2.5 video wan25 5 or 10 s 110 · ×2 at 1080p (image to video only)
Seedance 2.0 video seedance2 4–15 s per second: 105 @480p · 210 @720p · 500 @1080p · 1000 @4K (audio always on)
Seedance 2.0 Enterprise video seedance2 enterprise 4–15 s same as Seedance 2.0; requires organizationId only available to Enterprise Customers with an active organization
Gemini Omni Flash video gemini omni 3–10 s 100 per second (audio always on)
Workflow
1. POST /videos
2. Poll GET /videos/{id} every 2–3 s
3. On status === "ready" , read videoVersions.original
See [examples/video generation.py](examples/video generation.py).
3. Image Editing — POST /image edits
Parameter Type Notes
mode string Required. context (AI editing) or skin (skin fix).
prompt string Edit instruction. May contain @modelname tags.
imageUrl string Single source image URL.
inputImageUrls string[] Multi reference source images (up to 9 in practice).
originalImageCompletionId UUID Edit a previously generated LetzAI image.
originalImageCompletionIds UUID[] Several LetzAI images as sources.
baseModel string Same identifiers as image generation.
settings object { resolution, aspect ratio, model }
imageCompletionsCount int Variations to generate (1–5, default 1). Not used by skin .
mask string Base64 mask, legacy inpainting only.
width / height number Target dimensions.
webhookUrl , organizationId , hidePrompt
settings :
resolution : "2k" (HD) or "4k" (Ultra HD)
aspect ratio : "1:1" , "16:9" , "9:16" , "4:3" , "3:4" , "21:9" , "9:21"
model : same identifiers as baseModel
Provide at least one source: imageUrl , inputImageUrls , originalImageCompletionId
or originalImageCompletionIds .
Prefer the top level baseModel . Server side queue routing reads baseModel ;
settings.model is forwarded to the worker. Setting both to the same value is safest.
Workflow
1. POST /image edits
2. Poll GET /image edits/{id} every 3 s
3. On status === "ready" , read generatedImageCompletion.imageVersions.original
mode: "in" (inpainting) and mode: "out" (outpainting) are deprecated — use context .
4. Upscaling — POST /upscale
The public route is /upscale (singular). /upscales is the private web app route
and returns 404 here.
Parameter Type Default Notes
imageId UUID — A LetzAI image completion ID.
imageUrl string — Public image URL. Use instead of imageId . To upscale your own file, upload it via /user assets and pass the returned imageUrl .
mode string default Upscaler model — see table.
size number — 2–12; output tier — see table.
strength number 1 1–5.
prompt string — Optional guidance for creative upscalers.
webhookUrl , organizationId
mode Upscaler size → output Credits
nano banana pro Google Gemini 3 Pro 4 → 1K · 8 → 2K · 12 → 4K 80 / 160 / 240
nano banana 2 Google Gemini 3.1 Flash 4 → 1K · 8 → 2K · 12 → 4K 50 / 100 / 150
gpt image 2 OpenAI GPT Image 2 4 → 1K · 8 → 2K · 12 → 4K 160 / 240 / 480
pruna Pruna P Image Upscale 4 → 1 MP · 8 → 4 MP · 12 → 16 MP 20 / 40 / 80
default LetzAI in house — 20
Workflow
1. POST /upscale
2. Poll GET /upscale/{id} every 3 s
3. On status === "ready" , read imageVersions.original
5. Uploading Your Own Files — POST /user assets
Two step pre signed S3 upload. Use this to get a public URL for a local file before
feeding it to /image edits , /videos or /upscale .
1. POST /user assets with { extension } (plus optional originalFilename ,
mimeType , fileSize , caption , metadata , numberOfImages ).
2. PUT the raw file bytes to the returned uploadUrl with the matching Content Type
header. No Authorization header — the URL is already signed.
3. The file is then reachable at imageUrl from the step 1 response.
Allowed extension values: jpg , jpeg , png , gif , webp , mp4 , webm , mov ,
avi , mp3 , wav , ogg , m4a , aac , flac .
POST /user images is the older image/video only variant of the same flow; prefer
/user assets , which also accepts audio.
See [examples/uploads and training.md](examples/uploads and training.md).
6. Custom AI Models ( @modelname )
Trained models for persons, objects and styles. Tag them inside any image or edit
prompt: @john doe on the beach at sunset .
List: GET /models — query params page , limit , sortBy , sortOrder , search ,
name , userId , username , class ( person object style ), type ,
description , privacy ( public private licensed ), systemVersion ,
isActive , status . Pagination is reported through the X Total Count ,
X Current Page , X Per Page and X Total Pages response headers.
Get one: GET /models/{id}
Train a new model: POST /models — this is available over the API (Enterprise
plans).
Parameter Notes
name Required. Alphanumeric, and . , max 50 chars. Becomes the @tag .
class Required. person \ style \ object
privacy public \ private \ licensed
type Optional; auto generated when omitted.
trainingDataUrls 1–50 public image URLs. Upload via /user assets first.
trainingMode e.g. default , slow
settings e.g. ["NO ADULT CONTENT", "NO VIOLENCE"]
description , website , webhookUrl , organizationId Optional.
Training starts automatically. Poll GET /models/{id} until status is available .
Manage: PATCH /models/{id} , DELETE /models/{id} ,
PUT /models/{id}/thumbnail .
Workflow Decision Tree
Create an image → pick baseModel + mode from the model table → POST /images →
poll GET /images/{id} → imageVersions.original .
Use a trained model → GET /models?class=person to find the name → put
@name in the prompt → generate normally.
Edit an image → get a source (URL, /user assets upload, or a LetzAI completion id)
→ POST /image edits with mode: "context" → poll → generatedImageCompletion.imageVersions.original .
Create a video → optional source image → POST /videos with
settings.mode = a video key → poll → videoVersions.original .
Upscale → POST /upscale with imageId or imageUrl → poll → imageVersions.original .
Train a model → upload images via /user assets → POST /models with
trainingDataUrls → poll GET /models/{id} until available .
Status Polling
Every generation endpoint is asynchronous: the POST returns an id , and you poll the
matching GET until a terminal status.
Resource Statuses
Images new · generating · ready · failed · interrupted · not allowed · hidden
Videos new · generating · ready · saved · failed · interrupted
Image edits new · generating · ready · saved · failed · interrupted
Upscales new · generating · ready · failed
Models new · pen