SimpliGen Docs
AI Agents

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:48199

Si 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
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 (+ packId opcional); los trabajos por jobId.

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
    }
  ]
}
CampoSignificado
localReadyTodos los archivos del modelo están instalados; el preset puede ejecutarse localmente ahora.
cloudEligibleEl preset puede ejecutarse en SimpliGen Cloud.
cloudCostCosto aproximado en créditos para una ejecución en la nube (null si no es elegible).
apiProviderNo nulo para presets de API externa (p. ej. OpenAI, Google) que la API de Control no puede enviar.
inputs / optionsQué 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.
promptFamilyLa 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.requiresPromptfalse 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

Request
{ "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

Request
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }
Response (201)
{ "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.

Request
{
  "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" }
}
CampoRequeridoNotas
presetIdsíDe GET /capabilities.
mediaTypesí"image" o "video".
packIdnoSi se proporciona, debe coincidir con el paquete del preset.
promptcondicionalRequerido 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.
backendno"auto" (predeterminado), "local", o "cloud". Auto prefiere local si está instalado, sino nube si está conectado.
imagecondicionalIdentificador de carga. Requerido para presets de imagen a X (inputs.requiresImage).
videocondicionalIdentificador de carga, para presets de entrada de video.
referenceImagescondicionalArray de identificadores o { handle, label }, para presets de imagen de referencia.
audiocondicionalIdentificador 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.
audioStartSecondsnoDónde en la pista comenzar, en segundos. También aceptado bajo options.
referenceVideoscondicionalArray de identificadores o { handle, soundtrackMode, durationSeconds }, para presets de clip de referencia.
referenceAudioscondicionalArray de identificadores o { handle, durationSeconds }, para presets de sonido de referencia.
lorasnoArray 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.
projectnoProject id o slug. Tiene como predeterminado el proyecto activo.
options.aspectRationoDebe ser una de las relaciones soportadas del preset.
options.steps / options.cfgnoDentro de los rangos anunciados del preset.
options.negativePromptnoTé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.durationSecondsnoDuración del video.
options.resolutionnoEtiqueta de nivel de resolución.
Response (201)
{ "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).

Response
{
  "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.

Response (200)
{
  "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..."
}
CampoSignificado
family / familyNameLa familia de guía a la que se resuelve el preset, y su nombre de pantalla (consulta promptFamily en GET /capabilities).
versionLa versión de la guía de esta familia.
generictrue cuando no existe una guía específica del modelo para este preset. El text entonces lo dice claramente y da solo consejo general.
textLa 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.
HTTPerrorCodeCuándo
404unknown_presetSin preset con ese id.
503guides_unavailableNo 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

Request
{ "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.

EndpointPropósito
GET /charactersListar caracteres.
GET /characters/:idObtener un carácter.
GET /character-presetsPresets de caracteres instalados (base, edición, i2v).
GET /character-featuresOpciones de características de identidad/apariencia disponibles.
POST /charactersCrear un carácter (mode: "generate" de una descripción, o "upload" de un identificador de imagen base cargado).
POST /characters/:id/generate-imageGenerar una imagen del carácter ({ prompt, aspect?, count?, presetId? }).
POST /characters/:id/generate-frameGenerar un solo fotograma de inicio de video.
POST /characters/:id/animateAnimar el carácter en un video.
POST /characters/:id/presetEstablecer el preset predeterminado del carácter.
POST /characters/:id/enhanceAmpliació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.

EndpointPropósito
GET /recipe-blocksPuntos de entrada + cada preset utilizable como un paso, con su contrato de puerto.
POST /recipes/validateEjecución en seco de un spec (componer+validar) o un config, sin guardar. Devuelve validation.
POST /recipesComponer desde un spec y guardar un borrador. Devuelve { recipeId, valid, errors, config }.
GET /recipesListar 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/:idObtener una receta, su configuración completa, sus inputs, y readiness (por paso: qué preset ejecuta y si está instalado localmente).
POST /recipes/:id/runEjecutar 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/runsEjecuciones recientes de una receta, más nuevas primero.
GET /recipe-runs/:idEstado 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/cancelDetener una ejecución. No se inician más pasos; un paso local en vuelo se interrumpe.
POST /recipes/:id/publishEnviar 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.

EndpointPropósito
GET /subjectsCada sujeto que una receta puede tomar: caracteres y productos (id, type, name, status).
GET /productsListar productos.
GET /products/:idObtener un producto.
POST /productsCrear 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/:idRemover 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.

POST /recipes request
{
  "spec": {
    "name": "Product to spinning video",
    "category": "product",
    "steps": [
      { "preset": "krea2-pack:krea2-turbo" },
      { "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
    ]
  }
}
Response (201)
{
  "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 }.

RutaLo que hace
GET /films?projectId=Películas de un proyecto (predeterminado: el actual).
POST /filmsCrear 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/:idLa línea de tiempo.
PATCH /films/:idConfiguración de película: aspect, quality, hires2x, renderOn, presets, subject, cast (nombres o ids), location (nombre, id o null).
POST /films/:id/tracksAgregar una pista: upload (un identificador de POST /uploads), kind (singing, music, dialogue, effects), name, at.
PATCH /films/:id/tracks/:trackat, muted, volume (0 a 1).
POST /films/:id/tempoDetectar el tempo desde la pista no silenciada más larga, o track. Responde { bpm, offset, track, timeline }.
POST /films/:id/clipsAgregar un clip: at, length, name, lane.
PATCH /films/:id/clips/:clipshots (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/moveat, lane.
POST /films/:id/clips/:clip/trimlength, trimIn (dónde comienza el clip dentro de su toma; 0 es el inicio de la toma).
DELETE /films/:id/clips/:clipRemover el clip.
POST /films/:id/planDiseñar un borrador (abajo).
POST /films/:id/fadestarget (un clip o una pista), fadeIn, fadeOut.
POST /films/:id/markersat, name.
POST /films/:id/export-rangefrom y to (ambos necesarios), o clear: true.
POST /films/:id/rendersRenderizar 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/takesLas tomas del clip, más nuevas primero.
POST /films/:id/clips/:clip/takegenerationId: hacer que esa toma sea la que muestra el clip.
POST /films/:id/exportCoser 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

RutaLo que hace
GET /locationsUbicaciones de la Biblioteca: id, name, description, hasPicture.
POST /locationsCrear 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

HTTPerrorCodeCuándo
400invalid_jsonEl cuerpo no es JSON válido.
400invalid_optionsUn campo requerido falta o está malformado.
400invalid_presetDesajuste de preset/paquete/mediaType.
400needs_*Falta una entrada requerida (prompt, imagen, referencias).
400invalid_handleUna entrada no era un identificador de carga válido.
400unsupported_backendEl preset se ejecuta en una API externa.
400preset_not_installedBackend local elegido pero los modelos no están instalados.
400cloud_not_connectedBackend en la nube elegido pero sin cuenta conectada.
400invalid_planUn plan de película tiene problemas; details.problems los lista todos.
400no_tempoUn tiempo en compases antes de que la película tenga un tempo; detecta primero el tempo.
400no_audioTempo pedido de una película sin pista de audio.
400no_pulseNo se pudo escuchar un pulso constante en la pista.
401unauthorizedToken faltante o inválido.
402exceeds_spend_capEl costo en la nube excede el límite de gasto del token.
402exceeds_balanceEl saldo en la nube no cubre los renderizados.
403forbidden_hostEncabezado Host no loopback.
403studio_not_installedVideo Studio no está instalado en esta computadora.
404not_found / invalid_preset / job_not_foundRuta, preset, o trabajo desconocido.
404unknown_presetGET /prompt-guide/:presetId con un id que no es un preset.
404film_not_foundSin película con ese id.
404clip_not_foundSin clip por ese id, nombre o número.
404track_not_foundSin pista por ese nombre o id.
404cast_not_foundSin carácter por ese nombre o id en la Biblioteca.
404location_not_foundSin ubicación por ese nombre o id, o no tiene foto aún.
409clips_not_readyExportación solicitada mientras clips aún necesitan renderización; details.clips los nombra.
413asset_too_largeCarga superior a 100 MB.
503guides_unavailableNo se pudieron cargar las guías de prompt y ninguna está cacheada.
503cost_unknownToken limitado; el costo en la nube no pudo determinarse.
503studio_busyLa 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.
500internal_errorError del servidor inesperado.