Referencia de la API de Control
La API HTTP local que SimpliGen expone en tu máquina, para construir integraciones personalizadas y ejecutar generaciones sin interfaz gráfica.
SimpliGen ejecuta una pequeña API de Control HTTP en tu máquina mientras la aplicación está abierta. Es la misma API con la que habla el servidor MCP, expuesta directamente para que puedas impulsar SimpliGen desde tus propios scripts, servicios o agentes, incluso con la aplicación minimizada en la bandeja.
MCP versus la API de Control
Si solo deseas que un agente de IA (Claude, Codex, etc.) use SimpliGen, configura el servidor MCP en su lugar, que envuelve esta API. Usa la API de Control directamente cuando estés escribiendo una integración personalizada en cualquier lenguaje.
URL base y descubrimiento
El servidor se vincula solo a loopback y tiene como predeterminado:
http://127.0.0.1:48199Si ese puerto está ocupado, SimpliGen recurre a un puerto asignado por el SO. El puerto actual (y versión de API) siempre se escribe en un archivo de descubrimiento en el directorio de datos de usuario de la aplicación:
# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json{ "port": 48199, "version": 1 }Lee este archivo para encontrar el puerto activo en lugar de codificar 48199.
Requisitos
La API de Control solo se ejecuta cuando la aplicación está abierta y la máquina está autorizada para acceso de agente (forma parte de tu licencia). Las solicitudes solo se atienden cuando el encabezado Host es un alias loopback; cualquier otra cosa obtiene 403 forbidden_host (protección contra secuestro de DNS).
Autenticación
Cada endpoint excepto GET /health requiere un token de emparejamiento en el encabezado Authorization:
Authorization: Bearer sg-agent-xxxxxxxx...Crea un token en la aplicación en Configuración → Conectar un agente (consulta Conectar un agente). El token sin procesar se muestra una sola vez; solo se almacena un hash. Cada token puede llevar un límite de gasto opcional para generaciones en la nube. Revocar un token en la aplicación surte efecto inmediatamente.
Un token faltante o inválido devuelve 401 unauthorized.
Convenciones
- Solicitudes: cuerpos JSON (
Content-Type: application/json), hasta 50 MB. - Respuestas: siempre JSON.
- Errores: las respuestas no-2xx tienen la forma
{ "errorCode": "...", "message": "..." }. - IDs: los presets se direccionan por
presetId(+packIdopcional); los trabajos porjobId.
Una llamada autenticada mínima:
TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"Salud
GET /health
Sonda de disponibilidad. Sin autenticación.
{ "ok": true, "name": "simpligen", "version": 1 }Capacidades
GET /capabilities
Lista cada preset con el que puedes generar, una entrada por (preset, mediaType), con sus entradas, opciones, disponibilidad local e idoneidad/costo en la nube.
{
"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 | Significado |
|---|---|
localReady | Todos los archivos del modelo están instalados; el preset puede ejecutarse localmente ahora. |
cloudEligible | El preset puede ejecutarse en SimpliGen Cloud. |
cloudCost | Costo aproximado en créditos para una ejecución en la nube (null si no es elegible). |
apiProvider | No nulo para presets de API externa (p. ej. OpenAI, Google) que la API de Control no puede enviar. |
inputs / options | Qué acepta el preset y los rangos de opciones/relaciones de aspecto que puedes pasar a POST /generate. steps/cfg son no nulos solo para presets que exponen controles avanzados. |
promptFamily | La familia de guía de prompting para este preset (por ejemplo z-image), o null cuando no se declara ninguna. GET /prompt-guide/:presetId devuelve la guía. |
inputs.requiresPrompt | false para presets cuyas instrucciones están integradas (recortes, intercambios de cabeza u atuendo, ampliaciones): un prompt vacío es válido, y cualquier texto que envíes se agrega como notas adicionales. |
Estado
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
Inicia el motor local cuando aún no se está ejecutando. No toma cuerpo.
{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }Un arranque en frío tarda más de lo que la solicitud espera. Cuando eso ocurre, la respuesta es 202 con engineStarting: true y el motor sigue arrancando, así que sondea GET /status hasta que engineRunning sea true.
Iniciar un motor que ya se está ejecutando devuelve 200 con alreadyRunning: true y no cambia nada. Si no hay motor instalado, la respuesta es 409 engine_not_installed: instalar uno es una descarga de varios gigabytes y permanece como un trabajo para la aplicación, no para la API. Una máquina que el motor se niega a ejecutar responde 409 engine_unsupported_hardware, que reintentar no solucionará.
POST /engine/stop
Detiene el motor local y libera su VRAM. La generación en la nube no se ve afectada. Detener un motor que ya está inactivo es un éxito.
POST /engine/restart
Lo detiene e inicia nuevamente, para un motor atascado o después de que un nodo personalizado fue instalado o removido. El mismo comportamiento 202 que start cuando el arranque se prolonga más allá de la solicitud.
Proyectos
Los proyectos son los contenedores que contienen generaciones.
GET /projects
{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }POST /projects
{ "name": "Campaign assets" }Devuelve 201 con { "project": { ... } }. name es requerido (400 invalid_options de lo contrario).
Cargas
Las entradas (imágenes de origen, imágenes de referencia, videos de origen) nunca se pasan como rutas locales. Carga los bytes primero y pasa el identificador devuelto a POST /generate.
POST /uploads
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }La carga máxima es de 100 MB (413 asset_too_large). Las extensiones no soportadas devuelven 400 unsupported_file_type.
Generar
POST /generate
Encola una generación y devuelve inmediatamente con un jobId. Sondea GET /jobs/:id (consulta Trabajos) para el resultado.
{
"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 | Requerido | Notas |
|---|---|---|
presetId | sí | De GET /capabilities. |
mediaType | sí | "image" o "video". |
packId | no | Si se proporciona, debe coincidir con el paquete del preset. |
prompt | condicional | Requerido a menos que el preset reporte inputs.requiresPrompt: false. Esos presets tienen sus instrucciones integradas: envía "" para ejecutarlos como están, o agrega texto para pasar notas adicionales. |
backend | no | "auto" (predeterminado), "local", o "cloud". Auto prefiere local si está instalado, sino nube si está conectado. |
image | condicional | Identificador de carga. Requerido para presets de imagen a X (inputs.requiresImage). |
video | condicional | Identificador de carga, para presets de entrada de video. |
referenceImages | condicional | Array de identificadores o { handle, label }, para presets de imagen de referencia. |
audio | condicional | Identificador de carga, para presets impulsados por audio (sincronización de labios, audio a video). Requerido cuando el preset reporta acceptsAudio, de lo contrario el trabajo se rechaza con needs_audio. |
audioStartSeconds | no | Dónde en la pista comenzar, en segundos. También aceptado bajo options. |
referenceVideos | condicional | Array de identificadores o { handle, soundtrackMode, durationSeconds }, para presets de clip de referencia. |
referenceAudios | condicional | Array de identificadores o { handle, durationSeconds }, para presets de sonido de referencia. |
loras | no | Array de { name, weight } a aplicar, para presets donde inputs.supportsLoras es true. name coincide con el nombre de pantalla (o nombre de archivo) de una LoRA de GET /loras; weight tiene como predeterminado la fuerza predeterminada de la LoRA. Los nombres desconocidos devuelven 400 unknown_lora. Solo motor local por ahora. |
project | no | Project id o slug. Tiene como predeterminado el proyecto activo. |
options.aspectRatio | no | Debe ser una de las relaciones soportadas del preset. |
options.steps / options.cfg | no | Dentro de los rangos anunciados del preset. |
options.negativePrompt | no | Términos negativos adicionales (el negativo de Opciones Avanzadas de la interfaz). También aceptado en el nivel superior como negativePrompt. Aditivo: el negativo predeterminado del preset siempre se aplica y tus términos se agregan después de él (, ). Envía nada para usar el negativo predeterminado del preset. En ejecuciones de SimpliGen Cloud, los términos adicionales no se envían, y el negativo predeterminado del preset se usa como está. |
options.durationSeconds | no | Duración del video. |
options.resolution | no | Etiqueta de nivel de resolución. |
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }Para un trabajo en la nube, la respuesta también incluye "cloudCost": <credits>.
Backends
Los presets de API externa (donde apiProvider es no nulo, p. ej. GPT Image 2, Veo) no pueden ser despachados aquí, obtendrás 400 unsupported_backend. Usa un preset local o de SimpliGen Cloud. Cloud requiere una cuenta conectada (400 cloud_not_connected); local requiere los modelos instalados (400 preset_not_installed, prepáralos primero).
GET /loras
Lista las LoRAs instaladas del usuario para que los agentes puedan descubrir qué pasar en el array loras de POST /generate. Coincide con name (el nombre de pantalla).
{
"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 }
]
}Pasa la LoRA donde se ajuste al modelo base del preset (baseModel), y usa sus propias palabras de activación en tu prompt para que se active.
Guías de prompting
GET /prompt-guide/:presetId
Devuelve la guía de prompting para un preset: cómo su modelo lee un prompt, la estructura y longitud que le gusta, redacción de cámara y movimiento, negativos, cómo redactar caracteres, y ejemplos trabajados. Léela antes de escribir el prompt para POST /generate. Las guías son servidas por SimpliGen y cacheadas, así que también funcionan sin conexión desde la última copia de cada guía que fue abierta antes.
{
"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 | Significado |
|---|---|
family / familyName | La familia de guía a la que se resuelve el preset, y su nombre de pantalla (consulta promptFamily en GET /capabilities). |
version | La versión de la guía de esta familia. |
generic | true cuando no existe una guía específica del modelo para este preset. El text entonces lo dice claramente y da solo consejo general. |
text | La guía de familia en Markdown, seguida por una sección ## Negative prompts in SimpliGen que cada guía comparte. Cuando el preset tiene notas propias, se agrega una sección ## Notes for this preset. |
| HTTP | errorCode | Cuándo |
|---|---|---|
| 404 | unknown_preset | Sin preset con ese id. |
| 503 | guides_unavailable | No se pudieron cargar las guías y no existe copia cacheada: "Prompt guides could not be loaded. Check the internet connection and try again." |
Trabajos
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 es uno de queued, processing, completed, failed. En caso de éxito, resultPath es la ruta del archivo local decodificada; en caso de fallo, errorMessage explica por qué. El id desconocido devuelve 404 job_not_found.
GET /jobs
Devuelve los 25 trabajos más recientes como { "jobs": [ ...job... ] }.
POST /jobs/:id/cancel
Cancela un trabajo encolado o en ejecución. Devuelve { "jobId", "status", "note?" }. Un trabajo en la nube ya en vuelo puede completarse en el servidor (anotado en note).
Preparación de presets
Los presets locales descargan sus archivos de modelo en el primer uso. Puedes prepararlos con anticipación.
POST /presets/prepare
{ "presetId": "z-image-turbo", "mediaType": "image" }Devuelve 200 { "status": "already_installed" } o 202 { "status": "started" } (la descarga se ejecuta en segundo plano).
GET /presets/prepare
Devuelve descargas en vuelo: { "downloads": [ ... ] }. Sondea esto, o GET /capabilities (observa localReady), hasta que el preset esté listo.
Caracteres
Character Studio también es programable. Los caracteres son solo locales (la nube se rechaza). Consulta Caracteres para los conceptos.
| Endpoint | Propósito |
|---|---|
GET /characters | Listar caracteres. |
GET /characters/:id | Obtener un carácter. |
GET /character-presets | Presets de caracteres instalados (base, edición, i2v). |
GET /character-features | Opciones de características de identidad/apariencia disponibles. |
POST /characters | Crear un carácter (mode: "generate" de una descripción, o "upload" de un identificador de imagen base cargado). |
POST /characters/:id/generate-image | Generar una imagen del carácter ({ prompt, aspect?, count?, presetId? }). |
POST /characters/:id/generate-frame | Generar un solo fotograma de inicio de video. |
POST /characters/:id/animate | Animar el carácter en un video. |
POST /characters/:id/preset | Establecer el preset predeterminado del carácter. |
POST /characters/:id/enhance | Ampliación o mejora de un activo de carácter. Nombra la fuente con exactamente uno de target: "base", jobId (una generación anterior), o handle (de POST /uploads). Opcional: mediaType, presetId, scale, keepResolution, applyAsBase. |
Todos los endpoints de generación devuelven un jobId que sondeas a través de GET /jobs/:id, exactamente como POST /generate.
Recetas
Autor de recetas de pasos múltiples (flujos) fuera de paquetes y presets. Descubre los bloques de construcción, compone desde una especificación de alto nivel, luego opcionalmente publica.
| Endpoint | Propósito |
|---|---|
GET /recipe-blocks | Puntos de entrada + cada preset utilizable como un paso, con su contrato de puerto. |
POST /recipes/validate | Ejecución en seco de un spec (componer+validar) o un config, sin guardar. Devuelve validation. |
POST /recipes | Componer desde un spec y guardar un borrador. Devuelve { recipeId, valid, errors, config }. |
GET /recipes | Listar cada receta en este dispositivo (instalada desde la Tienda o autoreada aquí) con sus inputs (clave, tipo, etiqueta, requerida, opciones) y conteo de pasos. |
GET /recipes/:id | Obtener una receta, su configuración completa, sus inputs, y readiness (por paso: qué preset ejecuta y si está instalado localmente). |
POST /recipes/:id/run | Ejecutar una receta. Cuerpo: { inputs: { key: value }, engine?: "local" | "cloud" | "auto" }. Los inputs de asunto toman un id de carácter o producto, los inputs de imagen/video/audio toman identificadores de carga, todo lo demás toma valores simples. Devuelve { runId, status: "running", engine, steps, cloudCost? }. Las ejecuciones en la nube se cotizan por adelantado y cuentan contra el límite de gasto del token. |
GET /recipes/:id/runs | Ejecuciones recientes de una receta, más nuevas primero. |
GET /recipe-runs/:id | Estado de una ejecución: status (ejecutando, completado, fallido, cancelado), steps (cada uno con estado, id de trabajo y ruta de resultado) y resultPath una vez que se completa el último paso de medios. |
POST /recipe-runs/:id/cancel | Detener una ejecución. No se inician más pasos; un paso local en vuelo se interrumpe. |
POST /recipes/:id/publish | Enviar a la Marketplace del Creador (necesita una cuenta conectada). |
Productos y sujetos
Un input de subject de la receta toma un carácter o un producto. Los productos son el otro tipo de asunto: algo nombrado con una foto base, usado por Product Studio y recetas UGC.
| Endpoint | Propósito |
|---|---|
GET /subjects | Cada sujeto que una receta puede tomar: caracteres y productos (id, type, name, status). |
GET /products | Listar productos. |
GET /products/:id | Obtener un producto. |
POST /products | Crear un producto desde una foto cargada: { name, image: <upload handle>, description?, category? }. La descripción y categoría se tejen en los prompts de la receta. Devuelve { productId, product }. |
DELETE /products/:id | Remover un producto y su foto. |
Un spec es una descripción de alto nivel; la aplicación auto-cablerea puertos, la cadena de medios paso a paso, e input de prompt por paso, luego 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" } }
}Componer y guardar no necesita una cuenta de creador. POST /recipes/:id/publish requiere una cuenta conectada y devuelve not_connected (con needsConnect: true) hasta que el usuario conecte una en la aplicación; el borrador mismo se publica sin cambios. Cada preset que usa la receta debe pertenecir a un paquete distributable de primera parte.
Video Studio
Las películas son documentos de Video Studio: clips (tomas para renderizar) en una línea de tiempo sobre pistas de audio. Cada ruta de edición responde { change, timeline }: qué cambió, y la línea de tiempo de la película después (la misma forma que responde GET /films/:id). Con la película abierta en el estudio, el cambio se muestra en vivo y se deshace con Ctrl+Z; una película cerrada se edita y se guarda.
Los clips se nombran en la ruta por id, por nombre, o por número (su orden en la línea de tiempo, más temprano primero). Los tiempos son segundos, o compases una vez que la película tiene un tempo: una posición es 3, { "seconds": 3 } o { "bar": 5 } (el compás 1 es el primer pulso descendente), una longitud es 5, { "seconds": 5 } o { "bars": 2 }.
| Ruta | Lo que hace |
|---|---|
GET /films?projectId= | Películas de un proyecto (predeterminado: el actual). |
POST /films | Crear una película: name, projectId opcional, aspect (16:9, 9:16, 1:1), quality (480p, 720p, 1080p), renderOn (local, cloud), presets ({ t2v, i2v, r2v }). Responde la línea de tiempo. |
GET /films/:id | La línea de tiempo. |
PATCH /films/:id | Configuración de película: aspect, quality, hires2x, renderOn, presets, subject, cast (nombres o ids), location (nombre, id o null). |
POST /films/:id/tracks | Agregar una pista: upload (un identificador de POST /uploads), kind (singing, music, dialogue, effects), name, at. |
PATCH /films/:id/tracks/:track | at, muted, volume (0 a 1). |
POST /films/:id/tempo | Detectar el tempo desde la pista no silenciada más larga, o track. Responde { bpm, offset, track, timeline }. |
POST /films/:id/clips | Agregar un clip: at, length, name, lane. |
PATCH /films/:id/clips/:clip | shots (cada uno { prompt, seconds, line, speaker, framing }), cast, location ("none" deja caer el de la película, "film" lo hereda nuevamente), link (fresh, continue, motion; none y frame también se aceptan, como fresh y continue), hears ([{ track, on }]), preset. |
POST /films/:id/clips/:clip/move | at, lane. |
POST /films/:id/clips/:clip/trim | length, trimIn (dónde comienza el clip dentro de su toma; 0 es el inicio de la toma). |
DELETE /films/:id/clips/:clip | Remover el clip. |
POST /films/:id/plan | Diseñar un borrador (abajo). |
POST /films/:id/fades | target (un clip o una pista), fadeIn, fadeOut. |
POST /films/:id/markers | at, name. |
POST /films/:id/export-range | from y to (ambos necesarios), o clear: true. |
POST /films/:id/renders | Renderizar clips ("stale", el predeterminado, o una lista). Responde 202 con { started, held, credits } de una vez, o 200 con una note cuando nada necesita renderizar. |
GET /films/:id/clips/:clip/takes | Las tomas del clip, más nuevas primero. |
POST /films/:id/clips/:clip/take | generationId: hacer que esa toma sea la que muestra el clip. |
POST /films/:id/export | Coser la película. Responde 201 con { path, resultUrl, blanks }. |
Diseñando un borrador
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 }] }
]
}El plan se verifica como un todo primero. Un plan con problemas responde 400 invalid_plan con cada problema en details.problems (cada uno prefijado con su clip, como clip 2: ...) y no cambia nada. mode: "replace" reemplaza cada clip y se rechaza cuando los clips tienen tomas a menos que "discardTakes": true.
Renderización y el límite de gasto
Un renderizado en la nube se cotiza antes de encolar cualquier cosa y cuenta contra el límite de gasto del token: exceder el límite responde 402 exceeds_spend_cap, un precio desconocido 503 cost_unknown. Los clips que continúan desde el clip anterior se renderizaban uno a la vez, cada uno después de la toma de la que comienza; la llamada responde de una vez, y GET /films/:id muestra el take de cada clip: none, rendering, current, edited, longer, unknown (aún no se puede saber) o imported (un video traído, nunca renderizado).
Ubicaciones
| Ruta | Lo que hace |
|---|---|
GET /locations | Ubicaciones de la Biblioteca: id, name, description, hasPicture. |
POST /locations | Crear una ubicación desde su foto: name, description, y upload (un identificador) o fromJob (un trabajo de imagen terminado). |
Límites de gasto
Cuando un token tiene un límite de gasto, las generaciones en la nube se cotizan antes del envío y se rechazan si excederían la asignación restante (402 exceeds_spend_cap). Si el costo no se puede determinar (estado de la nube no disponible), un token limitado falla de forma cerrada con 503 cost_unknown. Las generaciones locales siempre están libres de costo de crédito.
Un flujo 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}'Códigos de error
| HTTP | errorCode | Cuándo |
|---|---|---|
| 400 | invalid_json | El cuerpo no es JSON válido. |
| 400 | invalid_options | Un campo requerido falta o está malformado. |
| 400 | invalid_preset | Desajuste de preset/paquete/mediaType. |
| 400 | needs_* | Falta una entrada requerida (prompt, imagen, referencias). |
| 400 | invalid_handle | Una entrada no era un identificador de carga válido. |
| 400 | unsupported_backend | El preset se ejecuta en una API externa. |
| 400 | preset_not_installed | Backend local elegido pero los modelos no están instalados. |
| 400 | cloud_not_connected | Backend en la nube elegido pero sin cuenta conectada. |
| 400 | invalid_plan | Un plan de película tiene problemas; details.problems los lista todos. |
| 400 | no_tempo | Un tiempo en compases antes de que la película tenga un tempo; detecta primero el tempo. |
| 400 | no_audio | Tempo pedido de una película sin pista de audio. |
| 400 | no_pulse | No se pudo escuchar un pulso constante en la pista. |
| 401 | unauthorized | Token faltante o inválido. |
| 402 | exceeds_spend_cap | El costo en la nube excede el límite de gasto del token. |
| 402 | exceeds_balance | El saldo en la nube no cubre los renderizados. |
| 403 | forbidden_host | Encabezado Host no loopback. |
| 403 | studio_not_installed | Video Studio no está instalado en esta computadora. |
| 404 | not_found / invalid_preset / job_not_found | Ruta, preset, o trabajo desconocido. |
| 404 | unknown_preset | GET /prompt-guide/:presetId con un id que no es un preset. |
| 404 | film_not_found | Sin película con ese id. |
| 404 | clip_not_found | Sin clip por ese id, nombre o número. |
| 404 | track_not_found | Sin pista por ese nombre o id. |
| 404 | cast_not_found | Sin carácter por ese nombre o id en la Biblioteca. |
| 404 | location_not_found | Sin ubicación por ese nombre o id, o no tiene foto aún. |
| 409 | clips_not_ready | Exportación solicitada mientras clips aún necesitan renderización; details.clips los nombra. |
| 413 | asset_too_large | Carga superior a 100 MB. |
| 503 | guides_unavailable | No se pudieron cargar las guías de prompt y ninguna está cacheada. |
| 503 | cost_unknown | Token limitado; el costo en la nube no pudo determinarse. |
| 503 | studio_busy | La ventana de SimpliGen no pudo alcanzarse o no respondió a tiempo. Si expiró, el cambio aún puede haberse hecho: lee la película antes de intentar nuevamente. |
| 500 | internal_error | Error del servidor inesperado. |