Riferimento API di controllo
L'API HTTP locale che SimpliGen espone sul tuo computer, per creare integrazioni personalizzate ed eseguire generazioni in modalità headless.
SimpliGen esegue una piccola API HTTP di controllo sul tuo computer mentre l'app è aperta. È la stessa API con cui il server MCP comunica, esposta direttamente in modo da poter controllare SimpliGen dai tuoi script, servizi o agent personalizzati, anche con l'app minimizzata nella system tray.
MCP vs l'API di controllo
Se vuoi solo che un agent IA (Claude, Codex, ecc.) usi SimpliGen, configura il server MCP invece, che racchiude questa API. Usa l'API di controllo direttamente quando stai scrivendo un'integrazione personalizzata in qualsiasi linguaggio.
URL di base e scoperta
Il server si collega solo a loopback e per impostazione predefinita a:
http://127.0.0.1:48199Se quella porta è occupata, SimpliGen ritorna a una porta assegnata dal SO. La porta corrente (e la versione API) è sempre scritta in un file di scoperta nella directory dati dell'app:
# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json{ "port": 48199, "version": 1 }Leggi questo file per trovare la porta live invece di codificare 48199.
Requisiti
L'API di controllo funziona solo quando l'app è aperta e il computer è
autorizzato per l'accesso degli agent (fa parte della tua licenza). Le
richieste vengono servite solo quando l'header Host è un alias di loopback;
qualsiasi altro valore riceve 403 forbidden_host (una guardia anti-DNS-rebinding).
Autenticazione
Ogni endpoint tranne GET /health richiede un token di abbinamento nell'header
Authorization:
Authorization: Bearer sg-agent-xxxxxxxx...Crea un token nell'app in Impostazioni → Collega un agent (vedi Collega un agent). Il token grezzo è mostrato una sola volta; solo un hash viene memorizzato. Ogni token può avere un optional limite di spesa per le generazioni cloud. Revocare un token nell'app ha effetto immediato.
Un token mancante o non valido restituisce 401 unauthorized.
Convenzioni
- Richieste: corpi JSON (
Content-Type: application/json), fino a 50 MB. - Risposte: sempre JSON.
- Errori: le risposte non-2xx hanno la forma
{ "errorCode": "...", "message": "..." }. - ID: i preset sono indirizzati da
presetId(+ optionalpackId); i job dajobId.
Una chiamata autenticata minimale:
TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"Salute
GET /health
Sonda di vitalità. Nessuna autenticazione.
{ "ok": true, "name": "simpligen", "version": 1 }Capacità
GET /capabilities
Elenca ogni preset con cui puoi generare, un elemento per (preset, mediaType),
con i suoi input, opzioni, disponibilità locale e idoneità/costo cloud.
{
"capabilities": [
{
"packId": "local-core-pack",
"presetId": "z-image-turbo",
"mediaType": "image",
"name": "Z-Image Turbo",
"description": "Ultra-fast, high-quality images in seconds",
"apiProvider": null,
"inputs": {
"acceptsPrompt": true,
"requiresPrompt": true,
"requiresImage": false,
"acceptsReferenceImages": null,
"acceptsVideo": false,
"acceptsAudio": false,
"acceptsReferenceVideos": false,
"acceptsReferenceAudios": false,
"supportsLoras": true
},
"options": {
"steps": null,
"cfg": null,
"duration": null,
"resolution": null,
"aspectRatio": ["1:1", "3:4", "4:3", "9:16", "16:9"]
},
"cloudAliasTo": null,
"localReady": true,
"cloudEligible": true,
"cloudCost": 4
}
]
}| Campo | Significato |
|---|---|
localReady | Tutti i file del modello sono installati; il preset può funzionare localmente adesso. |
cloudEligible | Il preset può essere eseguito su SimpliGen Cloud. |
cloudCost | Costo approssimativo in crediti per un'esecuzione su cloud (null se non idoneo). |
apiProvider | Non-null per i preset API esterni (es. OpenAI, Google) che l'API di controllo non può inviare. |
inputs / options | Ciò che il preset accetta e gli intervalli di opzioni/proporzioni che puoi passare a POST /generate. steps/cfg sono non-null solo per i preset che espongono controlli avanzati. |
promptFamily | La famiglia della guida di prompting per questo preset (per es. z-image), o null quando nessuna è dichiarata. GET /prompt-guide/:presetId restituisce la guida. |
inputs.requiresPrompt | false per i preset le cui istruzioni sono integrate (ritagli, scambi di testa o outfit, upscale): un prompt vuoto è valido, e qualsiasi testo che invii è aggiunto come note extra. |
Stato
GET /status
{
"engineRunning": true,
"engineVersion": "v0.26.0",
"cloudConnected": true,
"creditBalance": 1280,
"activeProject": { "id": "default", "name": "My Project" },
"characters": { "enabled": true, "base": 1, "edit": 1, "i2v": 1, "enhancePresets": 2 }
}POST /engine/start
Avvia il motore locale quando non è già in esecuzione. Non accetta body.
{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }Un avvio a freddo richiede più tempo di quello che la richiesta aspetta. Quando
ciò accade la risposta è 202 con engineStarting: true e il motore continua
l'avvio, quindi esegui il polling di GET /status finché engineRunning non è
true.
Avviare un motore che è già in esecuzione restituisce 200 con alreadyRunning: true
e non cambia nulla. Se nessun motore è installato la risposta è 409 engine_not_installed: installarne uno è un download di diversi gigabyte e rimane
un lavoro per l'app, non per l'API. Una macchina su cui il motore rifiuta di
funzionare risponde 409 engine_unsupported_hardware, che i nuovi tentativi non
risolveranno.
POST /engine/stop
Arresta il motore locale e libera la sua VRAM. La generazione cloud non è interessata. Arrestare un motore che è già fermo è un successo.
POST /engine/restart
Lo arresta e lo avvia di nuovo, per un motore bloccato o dopo che un nodo
personalizzato è stato installato o rimosso. Stesso comportamento 202 di start
quando l'avvio dura più della richiesta.
Progetti
I progetti sono i contenitori che contengono le generazioni.
GET /projects
{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }POST /projects
{ "name": "Campaign assets" }Restituisce 201 con { "project": { ... } }. name è obbligatorio (altrimenti 400 invalid_options).
Caricamenti
Gli input (immagini sorgente, immagini di riferimento, video sorgente) non vengono
mai passati come percorsi locali. Carica prima i byte e passa l'handle
restituito a POST /generate.
POST /uploads
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }Il caricamento massimo è di 100 MB (413 asset_too_large). Estensioni non
supportate restituiscono 400 unsupported_file_type.
Genera
POST /generate
Mette in coda una generazione e restituisce immediatamente un jobId. Esegui il
polling di GET /jobs/:id (vedi Jobs) per il risultato.
{
"presetId": "z-image-turbo",
"packId": "local-core-pack",
"mediaType": "image",
"prompt": "a red fox in the snow, cinematic",
"backend": "auto",
"project": "default",
"image": "a1b2c3d4.png",
"referenceImages": [{ "handle": "e5f6.png", "label": "style" }],
"loras": [
{ "name": "RoomLora", "weight": 0.85 },
{ "name": "Mia", "weight": 0.75 }
],
"options": { "aspectRatio": "16:9", "steps": 8, "negativePrompt": "blurry, watermark" }
}| Campo | Obbligatorio | Note |
|---|---|---|
presetId | sì | Da GET /capabilities. |
mediaType | sì | "image" o "video". |
packId | no | Se fornito, deve corrispondere al pack del preset. |
prompt | condizionale | Obbligatorio a meno che il preset non riporti inputs.requiresPrompt: false. Questi preset hanno le loro istruzioni integrate: invia "" per eseguirli così come sono, o aggiungi testo per passare note extra. |
backend | no | "auto" (predefinito), "local", o "cloud". Auto preferisce local se installato, altrimenti cloud se connesso. |
image | condizionale | Handle di caricamento. Obbligatorio per i preset image-to-X (inputs.requiresImage). |
video | condizionale | Handle di caricamento, per i preset con input video. |
referenceImages | condizionale | Array di handle o { handle, label }, per i preset con immagini di riferimento. |
audio | condizionale | Handle di caricamento, per i preset azionati da audio (sincronizzazione delle labbra, audio-to-video). Obbligatorio quando il preset riporta acceptsAudio, altrimenti il job è rifiutato con needs_audio. |
audioStartSeconds | no | Dove nella traccia iniziare, in secondi. Anche accettato sotto options. |
referenceVideos | condizionale | Array di handle o { handle, soundtrackMode, durationSeconds }, per i preset con clip di riferimento. |
referenceAudios | condizionale | Array di handle o { handle, durationSeconds }, per i preset con audio di riferimento. |
loras | no | Array di { name, weight } da applicare, per i preset dove inputs.supportsLoras è true. name corrisponde al nome visualizzato di una LoRA (o al nome file) da GET /loras; weight predefinito sulla forza predefinita della LoRA. I nomi sconosciuti restituiscono 400 unknown_lora. Solo backend locale per ora. |
project | no | Project id o slug. Per impostazione predefinita il progetto attivo. |
options.aspectRatio | no | Deve essere una delle proporzioni supportate dal preset. |
options.steps / options.cfg | no | Entro gli intervalli pubblicizzati dal preset. |
options.negativePrompt | no | Termini negativi extra (il negativo delle Opzioni Avanzate dell'UI). Anche accettato al livello superiore come negativePrompt. Additivo: il negativo predefinito del preset è sempre applicato e i tuoi termini sono aggiunti dopo (, ). Non inviare nulla per usare il negativo predefinito del preset. Sulle esecuzioni su SimpliGen Cloud i termini extra non vengono inviati, e il negativo predefinito del preset è usato così com'è. |
options.durationSeconds | no | Durata del video. |
options.resolution | no | Etichetta del livello di risoluzione. |
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }Per un job cloud la risposta include anche "cloudCost": <credits>.
Backend
I preset API esterni (dove apiProvider è non-null, es. GPT Image 2, Veo)
non possono essere inviati qui, riceverai 400 unsupported_backend. Usa un
preset locale o SimpliGen Cloud. Cloud richiede un account connesso
(400 cloud_not_connected); locale richiede i modelli installati
(400 preset_not_installed, preparali prima).
GET /loras
Elenca le LoRA installate dell'utente in modo che gli agent possano scoprire cosa
passare nell'array loras di POST /generate. Abbina su name (il nome visualizzato).
{
"loras": [
{ "name": "RoomLora", "filename": "RoomLora_000002400.safetensors", "baseModel": "flux", "triggerWords": "a room", "defaultStrength": 0.9 },
{ "name": "Mia", "filename": "mia_v2.safetensors", "baseModel": "flux", "triggerWords": "mia", "defaultStrength": 1.0 }
]
}Passa la LoRA dove si adatta al modello di base del preset (baseModel), e usa
le sue trigger word nel tuo prompt in modo che si attivi.
Guide di prompting
GET /prompt-guide/:presetId
Restituisce la guida di prompting per un preset: come il suo modello legge un
prompt, la struttura e la lunghezza che preferisce, la terminologia di camera e
movimento, i negativi, come descrivere i personaggi, e esempi funzionanti. Leggila
prima di scrivere il prompt per POST /generate. Le guide sono servite da
SimpliGen e messe in cache, quindi funzionano anche offline dall'ultima copia di
ogni guida che è stata aperta prima.
{
"presetId": "z-image-turbo",
"family": "z-image",
"familyName": "Z-Image",
"version": 1,
"generic": false,
"text": "# Z-Image prompting guide ...\n\n## Negative prompts in SimpliGen\n...\n\n## Notes for this preset\n\n..."
}| Campo | Significato |
|---|---|
family / familyName | La famiglia della guida a cui il preset si risolve, e il suo nome visualizzato (vedi promptFamily su GET /capabilities). |
version | La versione della guida di questa famiglia. |
generic | true quando non esiste una guida specifica del modello per questo preset. Il text allora lo dice chiaramente e dà solo consiglio generale. |
text | La guida della famiglia in Markdown, seguita da una sezione ## Negative prompts in SimpliGen che ogni guida condivide. Quando il preset ha sue note, una sezione ## Notes for this preset è aggiunta. |
| HTTP | errorCode | Quando |
|---|---|---|
| 404 | unknown_preset | Nessun preset con quell'id. |
| 503 | guides_unavailable | Le guide non potevano essere caricate e nessuna copia in cache esiste: "Prompt guides could not be loaded. Check the internet connection and try again." |
Job
GET /jobs/:id
{
"job": {
"jobId": "gen_abc123",
"status": "completed",
"backend": "local",
"mediaType": "image",
"presetId": "z-image-turbo",
"projectId": "default",
"resultUrl": "local-file:///C:/Users/you/.../output.png",
"resultPath": "C:/Users/you/.../output.png",
"errorMessage": null,
"createdAt": "2026-06-25T20:00:00.000Z",
"completedAt": "2026-06-25T20:00:08.000Z"
}
}status è uno di queued, processing, completed, failed. Su successo,
resultPath è il percorso del file locale decodificato; su fallimento,
errorMessage spiega perché. Un id sconosciuto restituisce 404 job_not_found.
GET /jobs
Restituisce i 25 job più recenti come { "jobs": [ ...job... ] }.
POST /jobs/:id/cancel
Annulla un job in coda/in esecuzione. Restituisce { "jobId", "status", "note?" }.
Un job cloud già in volo potrebbe ancora completarsi sul server (annotato in note).
Preparazione dei preset
I preset locali scaricano i loro file modello al primo utilizzo. Puoi prepararli in anticipo.
POST /presets/prepare
{ "presetId": "z-image-turbo", "mediaType": "image" }Restituisce 200 { "status": "already_installed" } o 202 { "status": "started" }
(il download funziona in background).
GET /presets/prepare
Restituisce i download in volo: { "downloads": [ ... ] }. Esegui il polling di
questo, o di GET /capabilities (osserva localReady), finché il preset non è pronto.
Personaggi
Character Studio è scrivibile anche. I personaggi sono solo locali (il cloud è rifiutato). Vedi Personaggi per i concetti.
| Endpoint | Scopo |
|---|---|
GET /characters | Elenca i personaggi. |
GET /characters/:id | Ottieni un personaggio. |
GET /character-presets | Preset di personaggio installati (base / edit / i2v). |
GET /character-features | Opzioni di feature di identità/aspetto disponibili. |
POST /characters | Crea un personaggio (mode: "generate" da una descrizione, o "upload" da un handle di immagine di base caricata). |
POST /characters/:id/generate-image | Genera un'immagine del personaggio ({ prompt, aspect?, count?, presetId? }). |
POST /characters/:id/generate-frame | Genera un singolo frame di inizio video. |
POST /characters/:id/animate | Anima il personaggio in un video. |
POST /characters/:id/preset | Imposta il preset predefinito del personaggio. |
POST /characters/:id/enhance | Upscale o migliora un asset di personaggio. Nomina la sorgente con esattamente uno di target: "base", jobId (una generazione precedente), o handle (da POST /uploads). Optional: mediaType, presetId, scale, keepResolution, applyAsBase. |
Tutti gli endpoint di generazione restituiscono un jobId che esegui il polling
via GET /jobs/:id, proprio come POST /generate.
Ricette
Crea ricette multi-step (flussi) dai pack e dai preset. Scopri i blocchi di costruzione, componi da una specifica di alto livello, poi facoltativamente pubblica.
| Endpoint | Scopo |
|---|---|
GET /recipe-blocks | Punti di ingresso + ogni preset utilizzabile come step, con il suo contratto di porta. |
POST /recipes/validate | Prova a secco di una spec (componi+valida) o un config, senza salvare. Restituisce validation. |
POST /recipes | Componi da una spec e salva una bozza. Restituisce { recipeId, valid, errors, config }. |
GET /recipes | Elenca ogni ricetta su questo device (installata dallo Store o creata qui) con i suoi inputs (chiave, tipo, etichetta, obbligatorio, opzioni) e numero di step. |
GET /recipes/:id | Ottieni una ricetta, la sua config completa, i suoi inputs, e readiness (per ogni step: quale preset esegue e se è installato localmente). |
POST /recipes/:id/run | Esegui una ricetta. Body: { inputs: { key: value }, engine?: "local" | "cloud" | "auto" }. Gli input dei soggetti accettano un id di personaggio o prodotto, gli input di immagine/video/audio accettano handle di caricamento, tutto il resto accetta valori semplici. Restituisce { runId, status: "running", engine, steps, cloudCost? }. Le esecuzioni su cloud sono prezzate in anticipo e contano contro il limite di spesa del token. |
GET /recipes/:id/runs | Esecuzioni recenti di una ricetta, la più nuova per prima. |
GET /recipe-runs/:id | Stato di un'esecuzione: status (running, completed, failed, cancelled), steps (ognuno con status, id del job e percorso del risultato) e resultPath quando l'ultimo step media è completato. |
POST /recipe-runs/:id/cancel | Ferma un'esecuzione. Nessuno step ulteriore inizia; uno step locale in volo è interrotto. |
POST /recipes/:id/publish | Invia al Creator Marketplace (richiede un account connesso). |
Prodotti e soggetti
Un input subject di una ricetta accetta un personaggio o un prodotto. I prodotti sono l'altro tipo di soggetto: una cosa denominata con una foto di base, usata da Product Studio e dalle ricette UGC.
| Endpoint | Scopo |
|---|---|
GET /subjects | Ogni soggetto che una ricetta può accettare: personaggi e prodotti (id, type, name, status). |
GET /products | Elenca i prodotti. |
GET /products/:id | Ottieni un prodotto. |
POST /products | Crea un prodotto da una foto caricata: { name, image: <upload handle>, description?, category? }. La descrizione e la categoria sono tessute nei prompt delle ricette. Restituisce { productId, product }. |
DELETE /products/:id | Rimuovi un prodotto e la sua foto. |
Una spec è una descrizione di alto livello; l'app auto-collega le porte, la
catena media step-by-step, e un input di prompt per ogni step, poi valida.
{
"spec": {
"name": "Product to spinning video",
"category": "product",
"steps": [
{ "preset": "krea2-pack:krea2-turbo" },
{ "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
]
}
}{
"recipeId": "b1f2…",
"valid": true,
"errors": [],
"config": { "blocks": [ "…" ], "inputs": [ "…" ], "output": { "from": "n2.video" } }
}Comporre e salvare non richiede un account creatore. POST /recipes/:id/publish
richiede un account connesso e restituisce not_connected (con needsConnect: true)
finché l'utente non ne connette uno nell'app; la stessa bozza allora pubblica senza
modifiche. Ogni preset che la ricetta usa deve appartenere a un pack di prima parte
distribuibile.
Video Studio
I film sono documenti di Video Studio: clip (scene da renderizzare) su una timeline
su tracce audio. Ogni rotta di editing risponde con { change, timeline }: cosa è
cambiato, e la timeline del film dopo (la stessa forma che GET /films/:id risponde).
Con il film aperto nello studio il cambio è mostrato dal vivo e si annulla con
Ctrl+Z; un film chiuso è modificato e salvato.
Le clip sono nominate nel percorso per id, per nome, o per numero (il loro ordine
sulla timeline, il più antico per primo). I tempi sono secondi, o battute una volta
che il film ha un tempo: una posizione è 3, { "seconds": 3 } o { "bar": 5 }
(la battuta 1 è il primo downbeat), una lunghezza è 5, { "seconds": 5 } o { "bars": 2 }.
| Rotta | Cosa fa |
|---|---|
GET /films?projectId= | Film di un progetto (predefinito: quello corrente). |
POST /films | Crea un film: name, projectId opzionale, aspect (16:9, 9:16, 1:1), quality (480p, 720p, 1080p), renderOn (local, cloud), presets ({ t2v, i2v, r2v }). Risponde la timeline. |
GET /films/:id | La timeline. |
PATCH /films/:id | Impostazioni del film: aspect, quality, hires2x, renderOn, presets, subject, cast (nomi o id), location (nome, id o null). |
POST /films/:id/tracks | Aggiungi una traccia: upload (un handle da POST /uploads), kind (singing, music, dialogue, effects), name, at. |
PATCH /films/:id/tracks/:track | at, muted, volume (0 a 1). |
POST /films/:id/tempo | Rileva il tempo dalla traccia non silenziata più lunga, o track. Risponde { bpm, offset, track, timeline }. |
POST /films/:id/clips | Aggiungi una clip: at, length, name, lane. |
PATCH /films/:id/clips/:clip | shots (ognuno { prompt, seconds, line, speaker, framing }), cast, location ("none" elimina quella del film, "film" la eredita di nuovo), link (fresh, continue, motion; anche none e frame sono accettati, come fresh e continue), hears ([{ track, on }]), preset. |
POST /films/:id/clips/:clip/move | at, lane. |
POST /films/:id/clips/:clip/trim | length, trimIn (dove la clip inizia dentro la presa; 0 è l'inizio della presa). |
DELETE /films/:id/clips/:clip | Rimuovi la clip. |
POST /films/:id/plan | Stendi una bozza (sotto). |
POST /films/:id/fades | target (una clip o una traccia), fadeIn, fadeOut. |
POST /films/:id/markers | at, name. |
POST /films/:id/export-range | from e to (entrambi necessari), o clear: true. |
POST /films/:id/renders | Renderizza clips ("stale", il predefinito, o una lista). Risponde 202 con { started, held, credits } subito, o 200 con una note quando nulla ha bisogno di un render. |
GET /films/:id/clips/:clip/takes | Le prese della clip, la più nuova per prima. |
POST /films/:id/clips/:clip/take | generationId: rendi quella presa quella che la clip mostra. |
POST /films/:id/export | Unisci il film. Risponde 201 con { path, resultUrl, blanks }. |
Stendere una bozza
POST /films/:id/plan
{
"mode": "append",
"cast": ["Kai", "Mira"],
"location": "Rooftop",
"clips": [
{ "bars": 2, "shots": [{ "prompt": "@Kai looks over the city", "framing": "wide" }] },
{ "bars": 2, "link": "continue",
"shots": [{ "prompt": "@Kai sings to camera", "line": "Neon rain", "speaker": "Kai", "framing": "close-up" }] },
{ "bars": 3, "location": "Neon Street", "cast": ["Mira"],
"shots": [{ "prompt": "@Mira walks through the rain", "seconds": 4 }, { "prompt": "she turns", "seconds": 3 }] }
]
}Il piano è controllato come un tutto per primo. Un piano con problemi risponde
400 invalid_plan con ogni problema in details.problems (ognuno prefissato con
la sua clip, come clip 2: ...) e non cambia nulla. mode: "replace" sostituisce
ogni clip ed è rifiutato quando le clip hanno prese a meno che "discardTakes": true.
Render e il limite di spesa
Un render su cloud è prezzato prima che qualsiasi cosa sia messa in coda e conta
contro il limite di spesa del token: superare il limite risponde 402 exceeds_spend_cap,
un prezzo sconosciuto risponde 503 cost_unknown. Le clip che continuano dalla
clip precedente si renderizzano una alla volta, ognuna dopo la presa da cui inizia;
la chiamata risponde subito, e GET /films/:id mostra il take di ogni clip:
none, rendering, current, edited, longer, unknown (non può ancora essere
stabilito) o imported (un video portato dentro, mai renderizzato).
Posizioni
| Rotta | Cosa fa |
|---|---|
GET /locations | Le posizioni della Libreria: id, name, description, hasPicture. |
POST /locations | Crea una posizione dalla sua immagine: name, description, e upload (un handle) o fromJob (un job di immagine finito). |
Limiti di spesa
Quando un token ha un limite di spesa, le generazioni su cloud sono prezzate prima
dell'invio e rifiutate se supererebbero l'allowance rimanente
(402 exceeds_spend_cap). Se il costo non può essere determinato (stato cloud
non disponibile), un token limitato fallisce in chiusura con 503 cost_unknown.
Le generazioni locali sono sempre libere da costo di credito.
Un flusso completo
BASE=http://127.0.0.1:48199
AUTH="Authorization: Bearer sg-agent-..."
# 1. Pick a ready preset
curl -s $BASE/capabilities -H "$AUTH"
# 2. Generate
JOB=$(curl -s $BASE/generate -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"presetId":"z-image-turbo","mediaType":"image","prompt":"a red fox in the snow","options":{"aspectRatio":"16:9"}}' \
| jq -r .jobId)
# 3. Poll until done, then read resultPath
curl -s $BASE/jobs/$JOB -H "$AUTH" | jq '.job | {status, resultPath, errorMessage}'Codici di errore
| HTTP | errorCode | Quando |
|---|---|---|
| 400 | invalid_json | Il body non è JSON valido. |
| 400 | invalid_options | Un campo obbligatorio è mancante o malformato. |
| 400 | invalid_preset | Mismatch di preset/pack/mediaType. |
| 400 | needs_* | Un input obbligatorio (prompt, immagine, riferimenti) è mancante. |
| 400 | invalid_handle | Un input non era un handle di caricamento valido. |
| 400 | unsupported_backend | Il preset viene eseguito su un'API esterna. |
| 400 | preset_not_installed | Backend locale scelto ma i modelli non sono installati. |
| 400 | cloud_not_connected | Backend cloud scelto ma nessun account è connesso. |
| 400 | invalid_plan | Un piano di film ha problemi; details.problems li elenca tutti. |
| 400 | no_tempo | Un tempo in battute prima che il film abbia un tempo; rileva il tempo per primo. |
| 400 | no_audio | Tempo richiesto di un film senza traccia audio. |
| 400 | no_pulse | Nessun beat costante poteva essere sentito nella traccia. |
| 401 | unauthorized | Token mancante o non valido. |
| 402 | exceeds_spend_cap | Il costo cloud supera il limite di spesa del token. |
| 402 | exceeds_balance | Il saldo cloud non copre i render. |
| 403 | forbidden_host | Header Host non-loopback. |
| 403 | studio_not_installed | Video Studio non è installato su questo computer. |
| 404 | not_found / invalid_preset / job_not_found | Rotta sconosciuta, preset, o job. |
| 404 | unknown_preset | GET /prompt-guide/:presetId con un id che non è un preset. |
| 404 | film_not_found | Nessun film con quell'id. |
| 404 | clip_not_found | Nessuna clip per quell'id, nome o numero. |
| 404 | track_not_found | Nessuna traccia per quel nome o id. |
| 404 | cast_not_found | Nessun personaggio per quel nome o id nella Libreria. |
| 404 | location_not_found | Nessuna posizione per quel nome o id, o non ha ancora una foto. |
| 409 | clips_not_ready | Export richiesto mentre le clip hanno ancora bisogno di un render; details.clips le nomina. |
| 413 | asset_too_large | Caricamento sopra 100 MB. |
| 503 | guides_unavailable | Le guide di prompt non potevano essere caricate e nessuna è in cache. |
| 503 | cost_unknown | Token limitato; il costo cloud non poteva essere determinato. |
| 503 | studio_busy | La finestra SimpliGen non poteva essere raggiunta o non ha risposto in tempo. Se è andata in timeout, il cambio potrebbe ancora essere stato fatto: leggi il film prima di riprovare. |
| 500 | internal_error | Errore del server inaspettato. |