# Auroflow API · Beta 1.0

<!-- agent-entry:start -->
Documentación **2026.11.01.3** · Contrato `auroflow/public-agent/v1`.

**Empieza por [conectar tu agente](/connect-agent.md) y el [inicio rápido](/agent-quickstart.md).**
La clave propia Bearer funciona también para cuentas con Google. Para buscar una operación,
abre el [manual navegable](/docs). Instala sólo la receta elegida; sus referencias compartidas
están incluidas. [Versiones y cambios](/agent-changelog.md).
<!-- agent-entry:end -->


## Gráficos, logos y rótulos con HyperFrames y Remotion

Panel: https://auroflow.club/app#motion. Contrato y ejemplos: https://auroflow.club/motion-graphics.md. Usa `auroflow_capabilities {area:"motion"}`, `auroflow_list {kind:"sources"}`, `auroflow_plan_motion`, `auroflow_render_motion_zero` y `auroflow_get`. Compone gráficos independientes o sobre vídeos propios, con cola persistente y prioridad de cuenta. El render no cobra créditos AURO ni del proveedor; reutiliza audio grabado propio y no genera una locución nueva. El selector `engine:"remotion"` añade cinco presets de animación y exige su propia disponibilidad y licencia gratuita verificada; consulta `engines` y https://auroflow.club/remotion.md. Ambos motores comparten cola y permisos. Skill: https://auroflow.club/skills/auroflow-graphics-layers/SKILL.md (recetas `motion-graphics.md` y `remotion.md`).

## Conectar tu agente, también con una cuenta de Google

Entra en [API y tokens](https://auroflow.club/app#developers) y activa una vez tu
**token permanente de Auroflow**. También funciona con cuentas Google, sin crear
una contraseña local. No caduca; puedes mostrarlo y copiarlo de nuevo desde el
panel. Al **rotarlo**, el servidor invalida el anterior y emite uno nuevo en una
transacción. Actualiza los agentes que utilizaban el anterior. Tu contraseña,
sesiones, proyectos y claves temporales se conservan.

El panel muestra el token sólo después de una acción explícita y lo borra de la
vista al salir de la sección o cambiar de cuenta. No lo guarda en localStorage ni
sessionStorage. El servidor conserva el digest y un identificador de rotación;
reconstruye el secreto sólo para el titular mediante una derivación HMAC separada
por usuario y credencial, con su clave privada del servicio. Nunca se incluye en
assets públicos, documentación, URLs o logs. Guárdalo en el gestor de secretos
como `AUROFLOW_API_TOKEN`. Es Bearer Auth para REST y MCP con los permisos,
propiedad, saldo y política de acceso vigentes de la cuenta. Un token de agente
no puede revelar, crear ni rotar credenciales.

Las claves temporales opcionales siguen disponibles (7/30/90 días, muestra única).
El límite es de 20 claves activas, contando la permanente. Cada cliente puede usar
su propia clave temporal para revocarla independientemente.

Contrato de gestión, sólo con sesión verificada + CSRF en POST o Basic del titular:
`GET /v1/account-api-token` devuelve metadatos y `revision`, nunca el secreto.
`POST /v1/account-api-token/show` con `{}` revela el actual, sin rotarlo.
`POST /v1/account-api-token` con `{revision, operation_id}` activa o rota;
`operation_id` son 32 hexadecimales guardados antes de enviar. Repetir exactamente
la misma operación devuelve el mismo token; una revisión antigua da 409 y nunca
invalida el nuevo. Tras una respuesta incierta, consulta metadatos y compara
`last_operation_id` antes de confirmar la misma operación. Respuestas privadas
`no-store`; sin permiso de gestión para Bearer. Una cuenta deshabilitada, revocada
o no admitida pierde acceso aunque el token no tenga fecha de caducidad.

Para clientes stdio usa el puente Python oficial:
https://auroflow.club/skills/auroflow/scripts/auroflow_mcp.py (Python 3.9+, sin dependencias).
El proceso lee `AUROFLOW_API_TOKEN` del entorno protegido y habla con
`https://api.auroflow.club/v1/mcp`. Es excluyente con
`AUROFLOW_API_EMAIL`/`AUROFLOW_API_PASSWORD` de Basic Auth. El puente no extrae
sesiones del navegador, cambia Chrome, sigue redirecciones ni reintenta peticiones.
Los clientes que sólo admiten OAuth necesitan una vía stdio o soporte para Bearer;
este acceso no anuncia un servicio OAuth que no esté implementado.

Las respuestas tools/call incluyen `structuredContent:{http_status,response}` y
la misma información JSON en `content[].text`, para clientes anteriores. Lee
`isError`, el HTTP interno y el estado del recurso. HTTP202 es aceptado; conserva
el ID y consulta. Un timeout no autoriza volver a generar. Los errores incluyen
si el resultado es incierto y la acción siguiente; el puente conserva 401/403,
429 y la referencia de soporte sin imprimir credenciales o páginas de error.

El MCP y las claves de agente exigen 0 créditos adicionales de Auroflow, además del
precio visible 0 de Flow. La cotización depende de la promoción y política viva de
tu cuenta; si no es 0, el envío se rechaza con `platform_cost_not_zero` antes de
reservar o generar. No se concede una promoción ni se cambia tu plan al conectar
un agente. Las reservas, el aislamiento, la cola y la prioridad siguen en el
servidor. El Chrome de Flow pertenece al servidor; tu agente no tiene que abrirlo.


Base: `https://api.auroflow.club`. Cuenta: `https://auroflow.club/app`.
La web y la API se sirven desde el mismo nodo. `https://auroflow.club` también
sirve las mismas rutas `/v1/*`; conserva un único origen por sesión.
Documentación completa en texto plano: `https://auroflow.club/llms-full.txt`.
La API usa su propio contrato; no es una sustitución compatible de cualquier API de Google cambiando sólo una URL.

## Planificación y skills de producción

La entrada breve es `auroflow_agent_start {}` (`GET /v1/agent-start`). Devuelve
`response.start`, un contrato compacto sin IA, generación ni controles vivos.
Continuar con `auroflow_capabilities {area:"film_studio"}`, cuenta propia y `auroflow_plan_workflow`.
`auroflow_capabilities {area:"workflows"}` amplía el catálogo cuando se necesite. Está en
[agent-workflows.json](https://auroflow.club/agent-workflows.json); la API
ofrece `GET /v1/agent-workflows` y `POST /v1/agent-workflows/plan` autenticados.

```json
{"id":"workflow-mi-spot","production_type":"spot","aspect":"9:16","target_duration_seconds":15,"ad_preset":"tiktok-in-feed","cost_max":0}
```

La respuesta contiene `plan`: fuentes de8s, recortes exactos a24fps, presupuesto
de diálogo, lotes, continuidad, skill y orden de herramientas. Esta operación
no descarga la URL, no consulta un modelo, no guarda un film y no genera ni
reserva créditos. El tipo editorial admite `film`, `spot`, `documentary`,
`series_episode` e `ingredients`; documental y serie no se envían como tipos
inventados al director, que utiliza `film` o `spot`.

`execution_ready` expresa límites estáticos, no autorización ni precio vivo.
Los IDs futuros no son recursos observados. Si el máster está bloqueado, no
empezar a generar sus capítulos por defecto. Cada toma real requiere cuenta y
referencias propias, quote Auro0, preflight y precio Google visible0, Agent
desactivado y un envío único. La recuperación conserva el mismo ID.

Vertical es9:16 y horizontal16:9. Los Ads usan los presets vigentes del estudio;
15/30/60s son montajes, no duraciones nativas de una toma. El director acepta
hasta12tomas por film. El acabado servidor admite50clips/600s; con fuentes de8s
el máximo es400s. Sin acabado, el montaje básico admite100clips, hasta800s.
Planes editoriales de hasta1200s declaran capítulos parciales y el bloqueo del
máster cuando corresponda. La escucha automática admite hasta120s por revisión:
las piezas mayores se revisan por secuencias parciales y empalmes, conservando
sus hashes y la cobertura. Ninguna revisión parcial aprueba automáticamente
el máster, y ASR no acredita timbre, acento ni aprobación humana.

Las [cinco recetas de producción](https://auroflow.club/skills) cubren películas,
Ads/producto, documental, Ingredients y series. En MCP, `resources/list` y
`resources/read` exponen las skills y referencias de una allowlist estática;
por ejemplo `auroflow://skills/auroflow-film-production` y
`auroflow://skills/auroflow-film-production/references/payload-recipes.json`.
Un agente con sólo MCP puede leer esas instrucciones sin navegar ni descargar
archivos arbitrarios del servidor.

El [manifiesto de skills](https://auroflow.club/skills/manifest.json) contiene
paquetes ZIP completos con SHA-256, referencias y ejemplos. Instalar el paquete
en la carpeta de skills que soporte cada agente; configurar las credenciales
Auroflow por separado en su gestor seguro. El cliente Python añade `agent-start`,
`films --limit 5`, `film ID`, `film-next ID`, `workflows` y
`plan-workflow plan.json`. No necesita acceso a Chrome o Google del caller.
Elegir una receta principal y leer sus referencias cuando hagan falta.

## Una película para un agente sin contexto previo

La [skill de películas](https://auroflow.club/skills/auroflow-film-production/SKILL.md)
y su [plantilla integral](https://auroflow.club/skills/auroflow-film-production/references/payload-recipes.json)
incluyen una pieza de24s con tres tomas, un guion completo y el recorrido de
revisión. `cold_start_complete_film` contiene placeholders `<…>` no enviables;
reemplazarlos por IDs nuevos persistidos y datos observados y validar antes de
enviar. Una plantilla o un ensayo offline no acredita generación ni coste vivo.

| REST autenticado | MCP público | Objeto dentro de `response` |
| --- | --- | --- |
| `GET /v1/agent-start` | `auroflow_agent_start {}` | `start` |
| `GET /v1/films?compact=1&limit=5` | `auroflow_list {kind:"films", limit:5}` | `projects` |
| `GET /v1/films/{id}` | `auroflow_get {id}` | `project` completo |
| `GET /v1/films/{id}/next` | `auroflow_get {view:"next", id}` | `next` |
| `POST /v1/sequences/{id}/recover` | `auroflow_recover {id,cost_max:0}` | `sequence` |

El listado sólo incluye films propios; `limit` admite enteros1–20. Sirve para
retomar un proyecto observado, sin crearlo otra vez. `next` expone estado,
revisión, intención compacta, `next_operation:{tool,arguments,read_only}`,
`requires_input`, `polling` y `recovery`. No devuelve la fuente privada completa.
La siguiente operación es orientación, con `render_authorized:false`,
`live_gates_verified:false` y `human_approval:false`; no concede autorización
ni confirma precio. Resolver las entradas pendientes y comprobar los gates
antes de ejecutar una escritura sugerida. Una lectura sugerida sigue siendo
una lectura. Respetar el intervalo y máximo de espera por ciclo de `polling`.

El catálogo MCP admite `tools/list` con
`{_meta:{"auroflow/toolset":"film"}}` para anunciar sólo el recorrido de
películas. Sin filtro conserva el catálogo completo; el puente stdio ofrece
`AUROFLOW_MCP_TOOLSET=film`. Para títulos, datos y capas editables usar
`AUROFLOW_MCP_TOOLSET=graphics` o `_meta:{"auroflow/toolset":"graphics"}`;
para otras operaciones pedir la vista `full`. Filtrar descubrimiento no cambia
permisos, capacidades ni gates.

Para elegir capas según la situación usar `auroflow_graphics_templates`
(`POST /v1/graphics/templates`): lista compacta por `situation`, luego detalle
por `template_id`, motor y aspecto. Son ocho recetas originales con procedencia,
licencias y hashes; contienen bindings pendientes y no guardan ni renderizan.
La [guía de plantillas](https://auroflow.club/skills/auroflow-graphics-layers/references/community-templates.md)
separa estructura editorial de estilo visual. Continuar con `auroflow_capabilities {area:"graphics_styles"}`, seguido de
`auroflow_suggest_graphics` con estilo, motor y plataforma de destino explícitos.
`auroflow_review_graphics` (`POST /v1/graphics/review`) estima lectura, encaje,
solapes y zonas seguras editoriales sobre la composición tipada: sin modelo,
guardado, lectura de medios, comprobación factual ni render. La decisión de
diseño y la revisión del MP4 real siguen siendo necesarias. La skill
[auroflow-graphics-layers](https://auroflow.club/skills/auroflow-graphics-layers/SKILL.md)
incluye dirección visual y recetas para rótulos, datos y mensajes. En el cliente
Python: `graphics-styles`, `suggest-graphics SPEC.json` y
`review-graphics SPEC.json`. Ediciones: parche pequeño con IDs de capa estables
y revisión observada; vídeo y voz originales conservados.

Para una producción nueva: persistir brief/ID → plan_workflow → plan_film con
`engine:"codex-luna-medium"` y `auto_render:false` → next/film hasta draft_ready
→ revisar guion → guardar, si se edita, el objeto `script` completo con revisión
observada → releer revisión nueva → render explícito una vez → next/film →
secuencia → capas opcionales → ver y escuchar la entrega y revisar audio.
Guardar exige `title`, `synopsis`, `character`, `continuity`, `shots`, y para
cada toma `title`, `visual`, `dialogue`, `sound`. No enviar un parche parcial ni
reutilizar para renderizar la revisión anterior al guardado. Las respuestas de
film y revisión de audio están en `response.project`.

El reparto se elige expresamente. `auto` crea referencia/voz/Character; `library`
reutiliza el Character propio y su voz vinculada observados en el catálogo.
Al seleccionar library después del borrador, `character` debe identificar al
personaje observado; revisar los `visual` incompatibles para conservar su
apariencia. Pronombres y tomas de recurso compatibles no exigen repetir el nombre.
Si aparece
`film_cast_script_review_required`, revisar sólo los campos visuales compatibles,
guardar el guion completo conservando los diálogos y usar la revisión nueva.
No inventar un UUID ni sustituir el personaje elegido para eludir el bloqueo.

Ante timeout leer los mismos IDs antes de actuar. Para un error observado que
requiera recuperación, guardar esa intención y usar `auroflow_resume_film` con
revisión actual y coste0; sin `refresh_script` para una mera reconciliación.
La recuperación del film conserva sus fuentes y montaje y recupera una
dependencia existente una sola vez. Después de incertidumbre consultar; un404
no permite recrear un job o secuencia. Ni `next` ni `execution_ready` prueban
autorización, propiedad de referencias o coste0 para todas las cuentas.

## Dirección visual y preparación de prompts

Estas operaciones están disponibles por REST y MCP para la misma cuenta
verificada, sin acceso de operador ni al navegador. Preparan texto de forma
determinista: cero llamadas a modelos, generaciones o reservas de créditos.
No autorizan un render ni sustituyen los controles vivos de cuenta y coste.

| REST autenticado | MCP público | Resultado |
| --- | --- | --- |
| `GET /v1/video-guidance` | `auroflow_capabilities {area:"video_guidance"}` | Presets visuales y versión de las reglas de producción |
| `POST /v1/video-prompts/prepare` | `auroflow_prepare_video_prompt` | Prompt original, preparado y recibo de transformaciones |
| `GET /v1/graphics/styles` | `auroflow_capabilities {area:"graphics_styles"}` | Presets gráficos y directivas de diseño admitidas |
| `POST /v1/graphics/templates` | `auroflow_graphics_templates` | Selección compacta de recetas por situación, detalle con bindings y procedencia; sin guardar ni renderizar |

Elegir un preset observado o un `style` libre con acabado, luz, paleta y cámara.
El texto libre se conserva como dirección; no implica interpretar o ejecutar
cualquier instrucción. Para película o spot, pasar `style` a `auroflow_plan_film`
/ `POST /v1/films` —hasta 1000 caracteres—. Las producciones nuevas registran la política vigente en
`visual_direction.policy_version_at_creation` y fijan `visual_direction.style_lock`,
visibles en el mismo proyecto. El estilo se traslada a sus tomas nuevas; cada
compilación nueva aplica las reglas activas y cada trabajo ya creado conserva
su política original. Conservarlo con
las referencias y la continuidad. El retrato y los ingredientes aprobados siguen
gobernando la apariencia: un preset no transforma por sí solo una referencia
ilustrada en una persona real.

Para una toma manual, este es el argumento MCP de preparación:

```json
{
  "request": {
    "prompt": "La presentadora abre un libro sobre la mesa y mira a cámara.",
    "style": "photoreal_editorial",
    "cost_max": 0
  }
}
```

REST recibe el objeto interior `request`. El helper admite `prompt` de hasta
12000 caracteres y `style` opcional de hasta 2000; `cost_max`, si se incluye,
es el entero 0. Devuelve `source_prompt`, `prepared_prompt`, `style`,
`visual_preparation` y `policy_version`. El recibo conserva SHA del original,
del preparado y del estilo, además de cada sustitución. No guarda un job.
Usar `prepared_prompt` en el `prompt` de la toma y el mismo estilo en
`shot.style` para fijar también su recibo estructurado; la compilación real
añade una vez el bloque obligatorio de reglas. Escribir los
diálogos y la narración en sus campos literales, sin parafrasearlos.

Las compilaciones nuevas sustituyen los patrones reconocidos de apertura de
libros, carpetas o archivadores físicos y los gestos de pasar páginas por
acciones estáticas que conservan el estado abierto/cerrado declarado, la
ubicación y el apoyo del mismo objeto. Sin un estado explícito en el campo,
mantienen el estado establecido; no inventan aperturas, cierres, mesas ni
documentos. Conservar la intención con mirada, gesto sencillo o cámara y revisar
`visual_preparation` antes del envío. Los campos de audio y
los literales entre comillas se preservan; abrir una carpeta informática no es
esa acción física. Las reglas orientan la producción, sin garantizar anatomía,
física, voz o fidelidad del resultado. Tampoco convierten una URL en una fuente
de instrucciones fiables.

Los trabajos existentes conservan su política, prompts y huellas originales.
Recuperar el mismo ID no migra su versión, cambia el guion ni reenvía Generate.
Conservar versión, SHA y transformaciones junto al preflight de cada intención.
Receta específica: [dirección visual](https://auroflow.club/skills/auroflow-film-production/references/visual-direction.md).
El estilo de títulos e infografías se edita como otra pista; véase
[capas gráficas](https://auroflow.club/graphics-layers.md).

## MCP para agentes

Endpoint: `https://api.auroflow.club/v1/mcp` (Streamable HTTP, JSON-RPC sin
sesión MCP persistente). Usa tu clave de agente por Bearer Auth o la misma cuenta
verificada por Basic Auth que REST;
no hay una clave compartida de administrador. Las herramientas conservan los
permisos, el proyecto privado, la cola y la política de créditos de cada cuenta.
El cliente HTTP debe admitir una cabecera Authorization configurada de forma
segura. Los clientes que sólo admiten OAuth requieren soporte de cabeceras o un entorno capaz de ejecutar el puente stdio siguiente. Un conector remoto sólo OAuth sin ninguna de esas capacidades no es compatible actualmente.

Para cualquier cliente con MCP por stdio, descarga
`https://auroflow.club/skills/auroflow/scripts/auroflow_mcp.py` y configura:

```json
{"mcpServers":{"auroflow":{"command":"python3","args":["/ruta/absoluta/auroflow_mcp.py"]}}}
```

Proporciona `AUROFLOW_API_TOKEN`, o `AUROFLOW_API_EMAIL` y
`AUROFLOW_API_PASSWORD`, mediante el gestor de secretos o entorno protegido
del cliente. Elige un solo método; las cuentas Google crean su clave en
https://auroflow.club/app#developers. Python 3.9+, sin paquetes adicionales.
El puente sólo usa HTTPS con validación TLS; no sigue redirecciones ni reintenta
envíos. No escribas contraseñas en este JSON de ejemplo ni en prompts.

Recorrido MCP: `auroflow_capabilities` → `auroflow_upload_reference` si hace falta
→ `auroflow_quote` → `auroflow_compile` → `auroflow_generate_zero` →
`auroflow_get`. Guarda un ID `api-...` estable antes de generar. Si la respuesta
es incierta, lee ese mismo ID; `auroflow_recover` recoge el trabajo existente.
El servidor gestiona Chrome y Flow; los agentes no reciben controles del navegador.

En AUROFLOW, web, REST y MCP público comparten la misma cola y el worker
persistente conectado a la sesión administrada del servidor mediante Chrome DevTools MCP. Las
operaciones nativas de Flow, incluidas imágenes, Characters y voces, siguen
esa ruta; sin MCP conectado se bloquea el envío y se recupera el mismo ID.
El guion, la planificación, el montaje `assembly:"local"`, el reencuadre y el
acabado o revisión de audio son servicios del servidor y no necesitan Chrome.

La recuperación de conexión es interna al servidor. El modo `managed_endpoint`
usa un perfil permanente propio y un endpoint de depuración local; no cambia el
acceso web/API/MCP público. No requiere instalar Chrome o DevTools MCP en el
equipo del agente, abrir perfiles ni entregar credenciales Google o SSH.
Los clientes no reciben ni deben exponer CDP. Una consulta de salud no crea otra
conexión nativa ni rota procesos. **Reconectar no reenvía trabajos**: conservar
intención, IDs y recibos; consultar el mismo recurso ante una respuesta incierta.
El supervisor sólo puede recuperar su transporte con exclusión mutua,
presupuesto acotado y barrera de ausencia de acciones activas o inciertas.
Una sesión Google caducada sigue requiriendo atención y un transporte conectado
no acredita cuenta/proyecto ni coste0. El estado vivo prevalece sobre esta guía;
la instalación de una skill no acredita una prueba de reinicio de Windows.

Consulta `auroflow_queue` para tu posición, espera estimada y prioridad de cuenta,
y `auroflow_credits` para saldo, reservas y promoción. Web, REST y MCP usan la
misma cola durable: prioridad asignada por el servidor, turnos entre cuentas de
igual prioridad y orden de llegada dentro de cada cuenta. Un trabajo activo
termina antes de dar paso al siguiente. No se puede elevar prioridad enviando
un campo JSON o una cabecera. Los IDs de otras cuentas permanecen privados.
`queue.account_policy` declara `service_tier` (standard, priority o managed), límite individual y que el cliente no
selecciona la prioridad. La espera es aproximada y puede variar.
El estado público `/service.json` es agregado. `account_check_required` conserva
`ready:false` y pide comprobar la cuenta autenticada mediante `/v1/status`: una
reserva histórica de otro proyecto no decide la disponibilidad de tu proyecto.
Los bloqueos globales de saldo, navegador o mantenimiento siguen pausando el servicio.


`auroflow_upload_reference` recibe PNG/JPEG/WebP en base64, hasta 10 MiB, y
devuelve un `upload_id` privado. `ingredients` y `characters` aceptan imágenes
aprobadas (máximo tres referencias entre ambos); `first_frame`/`last_frame`
usan los slots Start/End. Un personaje visual conserva su imagen como Ingredient.
Los personajes nativos y las voces guardadas se descubren mediante
`auroflow_capabilities {area:"native_references"}` (REST `GET /v1/native-references`). El catálogo sólo
incluye identidades que creaste o que fueron asignadas a tu proyecto;
puede estar vacío o necesitar revalidación. Consultarlo no aprueba su uso ni
verifica semejanza, identidad acústica o continuidad.

Las recetas descargables de [Ingredients](https://auroflow.club/skills/auroflow-ingredients-video/SKILL.md),
[producto](https://auroflow.club/skills/auroflow-film-production/references/product-video.md),
[documental](https://auroflow.club/skills/auroflow-film-production/references/documentary.md) y
[serie](https://auroflow.club/skills/auroflow-film-production/references/video-series.md) incluyen cada
una su caso en `examples/`. Son plantillas reutilizables: resuelve los IDs de tu
propia biblioteca y revisa capacidades/coste antes de cada envío. No son recibos
de un render real ni una aprobación del contenido.

Puedes crear y guardar tus propias voces y personajes desde **Personajes y
voces** en `/app#library`, desde REST o desde el MCP. No necesitas que un operador
registre sus IDs. Una cuenta registrada y verificada utiliza su biblioteca y
proyecto privados, con el mismo plan y cola que sus vídeos.

1. Consulta `auroflow_capabilities {area:"voice_presets"}` (`GET /v1/native-voices/presets`).
2. Llama `auroflow_create_voice` (`POST /v1/native-voices`) con un ID estable
   `lib-...`, `display_name`, `base_voice`, `performance`, `sample_dialogue`
   literal, `approved: true` y `cost_max: 0`. El guardado no pulsa Sync ni pide
   una previsualización adicional. Se comprueba que el saldo no cambie.
3. Consulta `auroflow_get` (`GET /v1/native-operations/{id}`)
   hasta `state: completed`. Guarda `resource.flow_voice_id`.
4. Sube tu imagen con `auroflow_upload_reference` y conserva su `upload.id`.
5. Llama `auroflow_create_character` (`POST /v1/native-characters`) con otro
   `lib-...`, `display_name`, `image_upload_id`, `voice_id` de tu propia voz,
   `approved: true`, `cost_max: 0` e `info` opcional.
6. Espera a que termine y consulta `auroflow_capabilities {area:"native_references"}`. Utiliza los IDs
   y los **nombres exactos devueltos** al generar; Flow puede añadir un sufijo
   de aislamiento al nombre que escribiste. La web muestra el nombre sencillo.

Para generar la referencia en el servidor, consulta primero
`auroflow_capabilities {area:"image_engines"}` (`GET /v1/native-images/engines`).
`auroflow_create_image` y su alias compatible `auroflow_create_character_image`
aceptan `id`, `display_name`, `prompt`, `approved: true` y `cost_max: 0`.
Omitir `engine` conserva Flow/Nano Banana y exige su preflight vivo de coste cero.
El único agente externo ofrecido para imágenes es Codex Luna medio
(`gpt-6-luna`/`medium`). Su motor de imagen opcional `codex-native-image` es
un ID distinto de `codex-luna-medium`, usado por el director, y sólo se puede
seleccionar cuando el catálogo declare `ready: true`: usa la cuota ordinaria de la suscripción ChatGPT
existente, comprueba autenticación y cuota en cada operación y no utiliza Chrome,
claves API, compras de créditos ni fallback de pago. Una aplicación instalada o
una feature activada no demuestran que su proveedor exponga la herramienta de
imagen. El catálogo puede mantener este motor deshabilitado tras una prueba
inconclusa o sin PNG; entonces la API rechaza antes de admitir una generación.

Consulta `response.operation` hasta su finalización y conserva
`response.operation.resource.upload_id`, `sha256`, `size_bytes`, dimensiones e
`image_url` privado. Ese upload se puede utilizar como `image_upload_id` en el
paso 5; todavía no es un Character nativo ni su UUID. Las imágenes independientes
comparten límites, propiedad y turnos de la cola con los vídeos, sin depender de
la disponibilidad de Flow. Un resultado incierto se consulta o recupera con el
mismo `lib-...`, sin crear otro intento.

`approved: true` autoriza el uso de la referencia; no significa aprobación
humana de un vídeo. Límites actuales: 100 voces y 100 personajes por cuenta,
además del límite compartido de trabajos pendientes. No se permite registrar
IDs de otra cuenta ni elegir un proyecto ajeno. El perfil de vídeo disponible
sigue dependiendo de la sesión Google y de una cotización visible de 0.

Cada guardado conserva ID, revisión y huella de su petición en SQLite. Repetir
el mismo ID con el mismo contenido devuelve su estado; cambiar el contenido
produce409. Si se pierde la respuesta, consulta ese ID. Para reconciliarlo usa
`auroflow_recover` (`POST /v1/native-operations/{id}/recover`):
no repite una subida o un guardado de voz ya despachados. La web conserva sólo
el ID pendiente por cuenta y ofrece Consultar/Recuperar. No vuelvas a crear la
misma referencia con un ID nuevo por un timeout.

El ensayo de autoservicio del 18-10-2026 creó dos voces y dos personajes
nativos con dos cuentas Auroflow normales y completó un vídeo de 8 s por cuenta.
Uno recorrió MCP público; el otro ejecutó los formularios reales de la web
contra HTTPS con sesión normal, empezando con la biblioteca vacía. Los cuatro
guardados y ambos vídeos conservaron el saldo Google 25.050, con precio visible
0. La cuenta Google conectada tiene Ultra; no se verificó una cuenta Google
sin suscripción. La prueba funcional de la web no incluye valoración visual
del diseño ni aprobación humana de identidad vocal. Añadir otros recursos a tu
biblioteca no invalida una toma en cola que conserva las mismas identidades.

El adaptador MCP admite **un personaje nativo con su voz guardada incluida**.
Usa el nombre y los dos IDs reales del catálogo, por ejemplo:

```json
{
  "model": "Veo 3.1 - Lite [Lower Priority]",
  "mode": "ingredients",
  "duration_seconds": 8,
  "cost_max": 0,
  "characters": [{"flow_character_id": "UUID_DEL_PERSONAJE", "display_name": "NOMBRE_DEL_PERSONAJE", "role": "character", "approved": true}],
  "voices": [{"speaker": "NOMBRE_DEL_PERSONAJE", "description": "Conservar su voz guardada.", "flow_voice_id": "UUID_DE_SU_VOZ", "display_name": "NOMBRE_DE_SU_VOZ", "binding": "character", "character_id": "UUID_DEL_PERSONAJE", "approved": true}]
}
```

Añade `id`, `prompt` y los demás campos de la toma. Puedes combinar el personaje
con imágenes de entorno u objeto dentro del límite de tres referencias visuales.
`binding: "character"` usa la voz ya incluida en el personaje; **no añade un
segundo ingrediente de audio**. Flow permite un solo audio: adjuntar otra vez la
misma voz por separado puede deshabilitarla. Los IDs deben pertenecer al
catálogo de esa cuenta y coincidir entre sí. El servidor comprueba de nuevo el
editor nativo, el UUID de voz, el nombre/retrato del selector y la vista previa
final antes de enviar; un cambio de catálogo o una identidad ambigua bloquea.

En las capacidades públicas, `native_characters.bound_character` y
`native_voice_reference_implementation.bound_character` describen esta ruta
implementada. `native_characters.unbound` y
`native_voice_reference_implementation.standalone` siguen deshabilitadas.
`implementation_scope` aclara el alcance y `requires_live_preflight` conserva la
comprobación viva: `implemented:true` no promete precio cero ni todas las
combinaciones probadas. `verified_profiles` mantiene la evidencia exacta. No
sumes otro retrato o audio del mismo personaje: Character + producto + entorno
son las tres referencias visuales completas, con una sola voz vinculada.

El piloto real del **18-10-2026 completó tres tomas diferentes de 8 segundos**
con Miga nativo y la misma voz guardada Alex mediante el MCP público, con una
sesión Aurora `role=user`. Cada envío verificó **Veo Lite Lower Priority,
Ingredients, 720p, 16:9, x1, Agent desactivado y coste Google exactamente 0**;
el saldo Google permaneció 25.050→25.050. La sesión Google compartida tiene
Ultra: este resultado no acredita gratuidad para todas las cuentas Google.

La comparación automática de las tres voces con la muestra guardada dio
similitudes coseno 0,824–0,854 y entre tomas 0,855–0,908. Es evidencia favorable
de consistencia acústica, no una certificación humana de identidad o acento.
Las palabras previstas se recuperaron por ASR; una discrepancia «no/nos» del
modelo pequeño se resolvió con un segundo modelo sin texto de ayuda. El piloto
también mostró subtítulos no solicitados en una toma, papeles dentro de una
carpeta pedida vacía y variaciones de encuadre/distribución de la oficina.
Cada película necesita revisión de imagen, diálogo, voz y cortes. No reemplazar
una voz guardada por una descripción textual ni inferir aprobación de un ID.

La voz guardada independiente sigue deshabilitada en el adaptador público; su
contrato de descubrimiento anterior era de Omni, cuyo precio histórico observado
de 8 s/720p/x1 fue **12 créditos Google**. Esos precios de Omni
no se aplican automáticamente al personaje compuesto de Veo. En cualquier
ruta, el envío exige coste visible exactamente 0 y Agent desactivado.

Para una película, genera cada toma con su ID y usa
`auroflow_compile_sequence`/`auroflow_create_sequence` con `assembly: "local"`,
un ID `seq-...` y `clips` ordenados de variantes terminadas del mismo proyecto.
Cada clip admite `trim_in`, `trim_out` y `mute_native`. El servidor exporta MP4
con FFmpeg y conserva hashes y procedencia; este modo no crea una Scene en Flow.
`audio.mode: "native_scene"` conserva el audio de los clips; `hybrid_post`
necesita una cama aprobada mediante `source_variant` y rango. No se regenera
ninguna toma al montar. Consulta `auroflow_get` para el enlace de entrega.
La aprobación humana de imagen y sonido se registra por separado.

`generate_zero` exige precio visible de Google exactamente 0 y Agent desactivado.
Eso no elimina la política de créditos de la plataforma Auroflow: consulta quote
y tu cuenta. La disponibilidad depende de la sesión y del plan Google del
servidor. Un cierre de sesión o reto de Google requiere mantenimiento del
operador; el agente recibe un estado explícito y conserva sus IDs.

## Acceso

Crea tu cuenta y verifica tu email en la web. Los clientes HTTP admiten la clave de agente por Bearer Auth o Basic Auth
preemptivo sobre HTTPS con email y contraseña; la web usa una sesión segura.
Guarda las credenciales en un gestor de secretos o en `AUROFLOW_API_EMAIL` y
`AUROFLOW_API_PASSWORD`, nunca en prompts, URLs, JSON de vídeo o repositorios.
No necesitas instalar Chrome, abrir Flow ni dar órdenes al ordenador servidor.

El recorrido de alta es único: abre `https://auroflow.club/app?register=1`, crea
la cuenta, verifica el enlace recibido por email, comprueba los 10 créditos
iniciales y crea el primer vídeo. Si la cuenta ya existe, entra por
`https://auroflow.club/app?login=1`; «Entrar» no crea una cuenta nueva.

Identifica tu integración con `User-Agent: AUROFLOW-Client/1.0-beta.1` (o un
nombre propio de cliente). El cliente Python descargable ya lo hace. El
identificador genérico `Python-urllib/3.9` devuelve `403` / `error code: 1010`
en la protección de Cloudflare, antes de llegar a la API; no es un fallo de
contraseña ni motivo para reenviar un trabajo. Usa el cliente suministrado o
configura esa cabecera en tu biblioteca HTTP. No desactives la verificación TLS.

## Si sólo tienes la URL, sin credenciales

La landing, los vídeos de demostración, esta guía, /llms.txt, /llms-full.txt,
la skill, el cliente y /openapi.json son públicos. Se leen sin cuenta y sin
JavaScript. No contienen contraseñas ni autorizan generación.

**Todos los usuarios deben registrarse y verificar su email para usar la API.**
No hay generación, subidas, compilación ni biblioteca para invitados. El antiguo
modo anónimo está desactivado; no llames a /v1/auth/guest ni intentes crear
sesiones para eludir el registro.

Si eres un agente sin credenciales, explica las capacidades y prepara el JSON
localmente; dirige al usuario a https://auroflow.club/app?register=1. Una vez
verificado, usa su clave propia de agente desde el almacén seguro. Basic Auth
con email y contraseña propios sigue siendo una alternativa. Si tu entorno
no dispone de herramientas HTTP/terminal, puedes preparar las llamadas, pero
no ejecutarlas; no inventes respuestas ni resultados. La URL de acceso
es https://auroflow.club/app?login=1.

## Ejemplo completo sin adivinar rutas

El archivo https://auroflow.club/examples/text.json contiene este contrato mínimo.
Cambia el ID por uno único antes del primer envío, guarda el JSON como shot.json
y conserva ese archivo e ID durante todos los intentos de consultar ese trabajo.

```json
{
  "id": "api-mi-primer-video-un-id-unico",
  "prompt": "Un faro al amanecer. Cámara lenta hacia delante, olas suaves, sin voces.",
  "operation": "generate",
  "mode": "text",
  "model": "Veo 3.1 - Lite [Lower Priority]",
  "aspect": "16:9",
  "duration_seconds": 6,
  "resolution": "720p",
  "audio": "native",
  "outputs": 1,
  "cost_max": 0,
  "agent_profile": {"mode": "disabled", "confirm_before_generate": true}
}
```

Cliente: https://auroflow.club/skills/auroflow/scripts/auroflow.py.
Configura AUROFLOW_API_EMAIL y AUROFLOW_API_PASSWORD mediante tu gestor de
secretos, o deja que el cliente pida las credenciales en una terminal interactiva.
No escribas la contraseña en el comando ni en shot.json.

```sh
python3 auroflow.py status
python3 auroflow.py credits
python3 auroflow.py quote shot.json
python3 auroflow.py compile shot.json
# Sólo después de validar y de que el usuario haya pedido generar:
python3 auroflow.py render shot.json --output video.mp4
# Si expiró la espera, continuar con el MISMO ID; no volver a render:
python3 auroflow.py wait api-mi-primer-video-un-id-unico --output video.mp4
```

Para HTTP directo, envía la misma autenticación Basic en cada llamada. Ejemplo
no generativo: curl pide la contraseña sin mostrarla ni escribirla en el historial.

```sh
curl --fail-with-body --user "tu@email.com" https://api.auroflow.club/v1/status
```

Campos de respuesta relevantes (no valores inventados):
GET /v1/me devuelve account.assigned; GET /v1/status, generation.ready;
GET /v1/credits, credits.available y credits.reserved; GET /v1/jobs/{id},
job.state, job.delivery.status y job.variants[].video_url. Descarga cada URL con la misma
autenticación y en el mismo origen. POST /v1/jobs devuelve 202 y job.id.

El historial privado está paginado: `GET /v1/jobs?offset=0&limit=20` devuelve
`jobs` y `pagination` (`offset`, `limit`, `total`, `next_offset`). Máximo 40
registros y 2 MiB de proyección por página. Sigue `next_offset` hasta `null`;
una página corta no significa fin del historial. Orden: más recientes primero.
Los offsets pueden desplazarse si llegan trabajos nuevos: deduplica por `job.id`.
Para seguir un vídeo conocido, consulta directamente `/v1/jobs/{id}`, sin
escanear el historial. La web muestra páginas de 20; su búsqueda y filtros
se aplican sólo a la página cargada, no a toda la biblioteca.

Los errores JSON incluyen su código estable y la respuesta anuncia
`X-Auro-Request-ID`, identificador aleatorio de diagnóstico. Al informar de un
fallo, comparte código, ID de trabajo e ID de petición, nunca contraseña,
cookies, cabecera Authorization ni el prompt privado. Las sesiones web usan
CSRF estable entre pestañas sin ampliar su fecha de caducidad; una sesión
antigua puede necesitar recargar una vez para adoptar ese token. La web
revalida la cookie al volver a una pestaña y comunica entre pestañas sólo un
aviso de cambio, nunca la contraseña, el token de sesión ni el CSRF. Si otra
pestaña cierra sesión, los datos del panel se retiran y se vuelve a pedir
acceso. Un `401 invalid_credentials` requiere revisar credenciales o usar
recuperación de contraseña; un `503 maintenance` no significa contraseña
incorrecta y no justifica cambiarla.
El cliente Python muestra el `X-Auro-Request-ID` validado en los errores HTTP,
sin imprimir el cuerpo privado de la respuesta. Si la interfaz indica
`upload_identity_ambiguous` o `upload_operator_review_required`, una imagen
puede haber llegado a Flow sin un identificador confirmado: conserva el mismo
job ID y los upload IDs, y pide reconciliación al operador. No repitas la subida
ni crees otro job automáticamente; `recover` sólo recoge resultados de render.
La compilación contiene compiled.creative.render_blockers; la cotización, quote.render_blockers. Inspecciona el JSON,
no sólo el código HTTP. El cliente status agrupa me bajo account y status bajo
service; por eso su ruta de asignación es account.account.assigned.
`generation.status` explica por qué no está listo: `account_pending` indica
que falta un proyecto individual disponible (no que falten créditos);
`recovery_required` indica un envío incierto en el proyecto asignado que debe recuperarse sin
reenviar; `flow_balance_guard_blocked` es un control del saldo del proveedor,
separado del saldo de Auroflow; `temporarily_unavailable` indica que la conexión
de generación no pudo confirmarse. Un trabajo antiguo bloqueado y ya
devuelto puede requerir atención en la biblioteca sin impedir un nuevo envío.
`queue_accepting` significa `generation.ready=true`: otro trabajo ocupa Flow,
pero la cola admite nuevas solicitudes. No implica que el render comience
inmediatamente; consulta `/v1/queue` para posición y ETA. `ready_after_navigation`
también admite el envío: el worker volverá al editor del proyecto asignado y
verificará de nuevo cuenta, controles y coste cero antes de pulsar Generar.

## Precio

1 crédito = 60 segundos de vídeo generado, sumados entre todas las variantes.
Una toma de 8 segundos cuesta 0,13333333 créditos; cinco tomas de 8 segundos
suman 40 segundos y cuestan 0,66666667. Cuatro variantes de una toma de 8
segundos suman 32 segundos y cuestan 0,53333333. Cinco tomas de 8 segundos con
cuatro variantes suman 160 segundos y cuestan 2,66666667. La contabilidad suma
milisegundos generados y divide el total por 60.000; no redondea cada clip.
El decimal periódico `0,13333333` de una toma de 8 s es exactamente
`8 ÷ 60` mostrado a ocho decimales, no un cargo adicional. En el panel,
los movimientos de trabajos indican también los segundos exactos.
La cuenta verificada comienza con 10 créditos (10 minutos).
`GET /v1/credits` informa saldo disponible, segundos disponibles y saldo reservado.
`POST /v1/quote` valida la petición y muestra su reserva sin generar.
Puede haber una promoción temporal sin descuento para los trabajos nuevos de todas
las cuentas verificadas. Consulta `GET /service.json` (`pricing.promotion`) y
`GET /v1/credits` (`credits.promotion`, `credits.unlimited`) antes de mostrar
un precio. Durante la promoción, `/v1/quote` devuelve `credits: 0` y
`standard_credits` conserva el coste ordinario de referencia. El saldo anterior
y el historial no se modifican. La fecha de caducidad está en UTC; tras ella
vuelve la tarifa ordinaria para los trabajos nuevos. La promoción no cambia
los límites de cola ni la comprobación de coste cero del proveedor.
La ampliación vigente cubre las cuentas registradas y verificadas hasta el
**1 de enero de 2027 a las 00:00, hora de Madrid**
(`2026-12-31T23:00:00Z`, límite exclusivo). Incluye cuentas nuevas verificadas
durante la ventana. El acceso de visitantes conserva su límite diario propio.
Los administradores y las cuentas con exención individual permanente reciben
`credits.promotion.permanent: true`, `credits.unlimited: true` y
`credits.promotion.expires_at: null`. La exención individual no modifica los
permisos de la cuenta. Los clientes deben usar la política de `/v1/credits` para
esa identidad; `/service.json` sólo publica la promoción general y nunca la
lista de cuentas exentas. Los trabajos ya exentos conservan esa condición tras
el vencimiento; las reservas anteriores mantienen su liquidación original.
Se reserva la duración pedida al admitir el trabajo y se liquida con la duración
medida de los vídeos completados, sin superar esa reserva. Los fallos verificados
devuelven la reserva; un envío incierto permanece reservado hasta reconciliarse.
Las diferencias pueden tardar unos segundos en aparecer. Compilar, subir imágenes,
consultar o descargar no consume créditos. Estos créditos son de AUROFLOW;
`cost_max: 0` es un control separado del proveedor y nunca debe aumentarse.
Auroflow realiza esa comprobación en el servidor. El usuario no necesita una cuenta
del proveedor ni abrir o gestionar Flow para usar la web o la API.

## Duración y cierre de la beta

La fuente de verdad es `GET https://auroflow.club/service.json`. `expires_at`
es nulo cuando el servicio no tiene fecha de cierre. La ampliación de gratuidad
hasta enero no cierra la API: después termina la exención temporal de créditos,
según `/v1/credits`, conservando el acceso autenticado. Si el operador configura
una fecha de cierre de la beta, se expresa en UTC y `beta.timezone` lo confirma.
Al vencer esa fecha de acceso, las operaciones
de cuentas temporales bajo `/v1/*` responden `410 api_expired`. Las cuentas con
exención permanente conservan acceso tras autenticarse; un cliente no puede
obtener la exención enviando un rol ni mostrando un saldo elevado. El inicio de
sesión y los medios privados del propietario, cuando están configurados,
siguen disponibles. `/v1/status` devuelve `permanent_access: true` y
`expires_at: null` para una identidad permanentemente exenta. Las páginas y
documentos públicos continúan disponibles. El vencimiento no elimina automáticamente datos
de cuenta, trabajos ni saldo Auroflow. Los avisos o cambios se publican en
`/service.json` y en esta guía. No se promete aviso por email ni disponibilidad
ininterrumpida durante la beta.

## Recorrido mínimo

1. `GET /v1/me`: comprueba `account.assigned`. Si falta capacidad, informa al usuario.
2. `GET /v1/status`: comprueba `generation.ready` y `generation.status`. Si
   aparece `flow_controls_unavailable`, Chrome está conectado pero la interfaz
   de Flow no permite verificar los controles de generación; espera a que el
   operador lo resuelva. No vuelvas a enviar un ID bloqueado sin revisar su
   estado durable. No
   interpretes todos los estados pausados como falta de créditos; tampoco
   pidas al usuario acceso remoto ni depuración.
3. `GET /v1/capabilities`: consulta las combinaciones aceptadas. Aceptación del
   esquema no prueba disponibilidad del modelo en vivo.
4. Diseña una toma y asigna un `id` único `api-...`; conserva el mismo JSON e ID.
5. `POST /v1/quote` y `/v1/compile`: corrige errores y `render_blockers`.
6. Si el usuario pidió generar, `POST /v1/jobs` con ese JSON. Devuelve `202`
   y `job.id`. El servidor hace la preparación y comprueba controles antes de enviar.
   El cliente no necesita pulsar botones, ejecutar comandos del servidor ni llamar
   a `/v1/preflight`; esta última es una herramienta de diagnóstico que modifica Flow.
7. Consulta `GET /v1/jobs/{id}` cada 5–15 segundos. Descarga los `video_url`
   del resultado con la misma autenticación. Una variante es un vídeo independiente.

`delivery.status=processing` o `recovering` indican trabajo pendiente: esperar.
Si hubo un envío incierto, el servidor busca y descarga el resultado existente
automáticamente sin pulsar Generar otra vez. `delivery.next_attempt_at` indica
cuándo reintentará la recogida; cerrar la web no detiene el trabajo.
`delivery.status=ready` ofrece los vídeos verificados. Sólo si aparece
`action_required` revisa el error y solicita `POST /v1/jobs/{id}/recover` con
`{}` tras comprobar la situación: esa acción sólo recoge, nunca genera de nuevo.
`failed` o `cancelled_verified` indican que no existe un MP4 confirmado; no
reenvíes automáticamente. Un error de red en POST no prueba que no se aceptó:
consulta el ID conocido. Un ID con contenido distinto devuelve `409`.
La API garantiza persistencia y un estado explícito, no un MP4 imposible si
Flow nunca llega a producirlo.
`429` pide backoff 5, 10, 20, 40 segundos. Cada cuenta normal admite 100
trabajos pendientes; manda planos por lotes pequeños y libera capacidad al
completarlos. `GET /v1/queue` indica para cada trabajo propio `position`
(posición global), `ahead_jobs`, `ahead_accounts`, `estimated_wait_seconds`
(hasta comenzar) y `estimated_completion_seconds`. `eta.status` explica si el
cálculo usa duraciones observadas o si está pausado/sin historial; valores
`null` no son un error. Las ETA son aproximadas y pueden variar si entran
trabajos de mayor prioridad o Flow tarda más de lo habitual.

## Texto, tamaño, idioma y duración

Descarga [text.json](https://api.auroflow.club/examples/text.json) como base.
Usa `aspect: "16:9"` o `"9:16"`; el modelo Lite admite 4, 6 u 8 segundos
en texto/Frames y 8 segundos en Ingredients. `outputs` es de 1 a 4. El servidor
verifica la combinación en vivo y puede bloquearla si el proveedor la cambia.
Describe sujeto, una acción, cámara, entorno, luz y sonido. Conserva el diálogo
literal, indicando idioma; no inventes frases del usuario. Divide guiones largos
en tomas, reutiliza referencias y espera a cada resultado. La generación de un
clip no equivale a tener una película montada ni a revisión humana de su contenido.

## Imágenes, personajes y entornos

`POST /v1/uploads?role=character&filename=hero.png` con bytes PNG y
`Content-Type: image/png`; JPEG y WebP también admitidos, máximo 10 MiB.
La respuesta es `{"upload":{"id":"img_...",...}}`. Usa sólo IDs observados de tu
catálogo. Roles: `character`, `environment`, `asset`, `style`, `start`, `end`.

El rol de uso puede declararse explícitamente en una referencia:
`{"upload_id":"img_...","role":"asset","approved":true}` para un producto,
o `role:"environment"` para un entorno. Esto también vale para una imagen privada
de Nano Banana creada mediante `auroflow_create_image`, cuyo nombre no
crea por sí solo un Character: la creación nativa es una operación distinta.
El propósito se describe en el prompt y el rol; `purpose` no es un campo admitido
por estas peticiones públicas. Conservar el upload y su SHA no aprueba la imagen
ni el resultado audiovisual humano.

Frames: añade `"first_frame":"img_..."` y opcionalmente
`"last_frame":"img_..."`. Ambos deben tener la proporción de salida.
Ingredients: añade `"characters":["img_..."]` y
`"ingredients":["img_..."]`, máximo tres imágenes en total. Duración: 8 segundos.
No mezcles Frames con Ingredients. Una imagen de personaje es una referencia
visual, no un identificador nativo de Flow Character. Las cargas y compilaciones
están implementadas; la generación multimedia depende de los controles vivos.

No envíes rutas locales del servidor, cookies Google, `project_url`, `account_ref`
ni `target_id`: el proyecto se asigna a tu cuenta. Para Extend, edición o montaje,
consulta el OpenAPI y las capacidades; no presentes opciones sin validar como disponibles.

## Guion, voz en off y paisajes sonoros

Un guion se divide en tomas de la duración permitida; no hay un campo que
convierta por sí solo una película larga en un único render. Describe el paisaje
sonoro en `prompt` y usa `narration` para preservar la voz literal. Ejemplo de
campos adicionales para una toma de 8 segundos:

```json
{
  "prompt": "Faro al amanecer. Cámara acercándose lentamente. Olas suaves y viento. Sin música.",
  "narration": [{
    "speaker": "narrador",
    "text": "El viaje empieza aquí.",
    "language": "es-ES",
    "accent": "España",
    "delivery": "voz serena, natural",
    "start_seconds": 1,
    "end_seconds": 4
  }]
}
```

`dialogues` usa el mismo formato para frases de personajes. No se debe prometer
clonación, voz idéntica entre tomas, pronunciación exacta o sincronía labial
garantizadas. La presencia de una pista de audio no demuestra calidad editorial.
Texto, Frames e Ingredients tienen pilotos completados. El piloto Ingredients
del 19 de septiembre de 2026 generó y descargó un vídeo con dos imágenes
(personaje y entorno), 8 segundos, 9:16, 720p y una salida en Veo 3.1 Lite
[Lower Priority]. Flow mostró coste 0 y el saldo observado no cambió.
Esto valida ese recorrido, no todas las combinaciones: tres referencias,
múltiples salidas y otros perfiles necesitan sus propias pruebas. La revisión
auditiva humana de ese piloto sigue pendiente. Cada nuevo envío vuelve a
comprobar sus controles y coste; un piloto anterior no autoriza otro render.
El montaje nativo sin recortes y la descarga mediante la extensión están
verificados para la secuencia Nora: tres tomas, 24 segundos, 9:16 y 720p. La
revisión humana de voces y cortes de audio sigue pendiente; los recortes y el
mute nativos requieren controles verificables. Extend y edición permanecen
bloqueados con `source_render_adapter_unverified`. En el piloto del 6 de octubre
de 2026 se verificaron la preparación de Extend desde el clip Veo de 4 segundos,
la reutilización exacta de su descarga y el compositor en español. Flow mostró
coste 5 en esa inspección y faltó comprobar modelo y Agent; no se pulsó Generate.
Esa observación corresponde al piloto, no a una tarifa universal. La API conserva
`cost_max=0`; consulta `preparation_verification` y `render_verification` en las
capacidades para distinguir la preparación acreditada del render pendiente.

## Skills y cliente

La entrada corta de la skill está en `/SKILL.md`; la ruta compatible
`/skills/auroflow/SKILL.md` sirve el mismo contenido y su cliente está en
`/skills/auroflow/scripts/auroflow.py`. Para un agente sin soporte de skills,
proporciona el enlace a `/llms.txt` y esta guía. No existe un mecanismo universal
que instale skills en todos los LLM: se guarda en el directorio que use el agente.

Ejemplos con el cliente (Python 3.9 o posterior, sin dependencias):

```sh
python3 auroflow.py status
python3 auroflow.py quote shot.json
python3 auroflow.py compile shot.json
python3 auroflow.py upload hero.png --role character
python3 auroflow.py render shot.json --output video.mp4
python3 auroflow.py wait api-mi-video --output video.mp4
```

No copies la contraseña en el comando: el cliente usa variables de entorno o
la pide de forma oculta en una terminal interactiva. `render` envía una vez y
espera. Si termina por timeout, continúa con `wait` y el mismo ID.

## Comunidad de creadores (miembros registrados)

La sección **Comunidad** de `/app#community` muestra los trabajos anteriores y
nuevos de las cuentas verificadas, con su autor, fecha, estado y variantes de
vídeo disponibles. Requiere una cuenta verificada incluso para ver el listado o
reproducir MP4. El prompt completo, email, saldo, referencias, proyecto Flow y
detalle privado de `/v1/jobs/{id}` no se comparten. Los trabajos `blocked` se
muestran con su estado, pero eso no los reintenta ni garantiza una entrega.

- `GET /v1/social/me` devuelve tu perfil y tus publicaciones activas. El
  identificador público inicial no se deriva de tu email.
- `POST /v1/social/profile` acepta exactamente `handle` (3–24 letras minúsculas,
  números o guiones), `display_name` (2–60 caracteres) y `bio` (hasta 280).
- `GET /v1/social/creators?offset=0` lista hasta 40 perfiles de miembros
  verificados por página, también si todavía no tienen vídeos. Devuelve sólo
  alias, nombre visible y biografía; requiere autenticación.
- `GET /v1/social/jobs?offset=0` devuelve hasta 40 trabajos saneados por página.
  Sigue `next_offset` hasta que sea `null`; no infieras fin de lista por recibir
  menos de 40, porque algunos registros heredados no tienen autor verificable.
- `GET /v1/social/profiles/{handle}` muestra el perfil y
  `GET /v1/social/profiles/{handle}/jobs?offset=0` sus trabajos.
- Cada variante terminada anuncia `url` en `videos[]`. La ruta
  `/v1/social/videos/jobs/{job_id}/variants/{ordinal}` permite `GET`, `HEAD`
  y `Range` a los miembros. No reutilices para ello la ruta privada del autor.
- `GET /v1/social/feed?offset=0` conserva el feed de publicaciones con título
  y descripción opcionales creadas antes de este cambio.
- `POST /v1/social/posts` con `{"job_id":"api-mi-video","variant":1,
  "title":"Mi título público","caption":"Descripción opcional"}` añade una
  ficha destacada opcional para una variante propia completada. No uses el
  prompt privado como título sin permiso. Esta acción no cambia la visibilidad
  automática del trabajo en `social/jobs`.
- `POST /v1/social/posts/{post_id}/unpublish` retira sólo esa ficha opcional.
  No oculta el trabajo ni sus vídeos del listado de la comunidad.

## Montar, reencuadrar y terminar el audio en el servidor

Abre `/app#films` en la web. Añade tomas terminadas de tu cuenta, ordena,
recorta sus tiempos y activa «Reencuadrar» para introducir el rectángulo en
píxeles. Elige igualar niveles y, si procede, suavizar ambiente. «Montar y
terminar · 0 créditos» procesa el MP4 en Auroflow y devuelve su descarga privada.
Puedes cerrar la web y consultar el mismo ID al volver; no necesitas Chrome,
FFmpeg ni editar archivos en tu ordenador.

Desde MCP utiliza `auroflow_compile_sequence` y `auroflow_create_sequence` con
`assembly: "local"`, `cost_max: 0`, `audio.mode: "native_scene"`, un ID estable
`seq-...` y las tomas/variantes reales de tu cuenta. El nombre `local` del
contrato significa exportación FFmpeg en el servidor, sin SceneBuilder de Flow.
No genera ni cobra otra vez las tomas fuente.

```json
{
  "id": "seq-mi-pelicula-v1",
  "title": "Mi película",
  "assembly": "local",
  "aspect": "16:9",
  "cost_max": 0,
  "clips": [
    {"job_id": "api-mi-toma", "variant": 1, "trim_in": 0, "trim_out": 8,
     "framing": {"crop": {"x": 312, "y": 48, "width": 688, "height": 387}}}
  ],
  "audio": {"mode": "native_scene"},
  "finishing": {"audio_normalize": true, "target_lufs": -16,
    "true_peak_db": -2, "edge_fade_ms": 25,
    "seam_smoothing_ms": 250, "video_fade_ms": 120},
  "speech_ranges": [{"start_seconds": 1, "end_seconds": 6.5}]
}
```

Sustituye el ID fuente por uno observado. Los recortes deben quedar dentro de
las dimensiones del vídeo; la salida se ajusta al formato720p/24fps sin estirar
la imagen. Hasta50tomas/600segundos. No se admiten rutas de archivos ni filtros
FFmpeg libres en estos parámetros. El consentimiento sobre las fuentes no es
aprobación humana del resultado.

`speech_ranges` son tiempos globales del montaje después de sus trims. El
suavizado sólo atenúa el ambiente inicial de un corte si queda fuera de esos
rangos. Sin rangos o si hay solapamiento, lo omite y lo documenta. La web protege
toda la toma por defecto; ajusta primera/última palabra para permitir suavizado
en sus márgenes. La nivelación y los fundidos no garantizan voz/acento perfectos.

Para corregir una pausa entre frases, mide primero el final y el inicio de la
voz y recorta únicamente márgenes sin habla. `clips[].tail_hold_seconds` admite
de 0 a 3 segundos: mantiene el último fotograma de esa toma y añade silencio al
final, sin estirar la voz ni separar su imagen del audio. Requiere `finishing`,
`assembly: "local"`, `audio.mode: "native_scene"` y `cost_max: 0`; cuenta en la
duración total y en los límites entre tomas. Los rangos de habla no pueden
incluir ese silencio añadido. Para conservar la interpretación sin nivelación,
usa `finishing.audio_normalize: false` y revisa el archivo resultante completo.
Elige un nuevo ID para un montaje corregido y una nueva pista gráfica si cambia
su vídeo base; las entregas anteriores conservan su historial.

Consulta `auroflow_get` con el mismo ID hasta completed. `video_url` sirve
el MP4 terminado con la autenticación habitual; `local_preview.finishing`
conserva configuración, fuentes SHA, recortes, cambios aplicados/omitidos y
análisis antes/después. Mantiene `human_audiovisual_approval: false`. Una alerta
de audio requiere revisión, no regenerar automáticamente. Repetir la petición
exacta devuelve el estado sin renderizar otra vez; cambiar sus ajustes con el
mismo ID produce409. Los montajes anteriores mantienen su contrato y su SHA.

Verificado el18-10-2026 con dos cuentas normales: montaje/descarga por MCP y envío desde el JavaScript publicado de la web con HTTPS real. Las pruebas incluyen repetición exacta sin nuevo render, conflicto por cambio del mismo ID y rechazo de fuentes/descargas ajenas. La prueba web ejecutó controles y envío; no certifica su disposición visual. El acabado preserva la voz original y no crea ni clona otra voz.

Prueba adicional del18-10-2026: recorrido real en Chrome con una cuenta normal, desde cargar/ordenar/reencuadrar hasta montar, reproducir y descargar. El historial se carga al entrar directamente; los rangos protegidos predeterminados siguen los trims. Comprobadas vistas de390,500y1144píxeles CSS. La reproducción completa de21,5s mantuvo el audio activo, sin errores ni fotogramas perdidos; la captura de sonido del navegador conservó todas las palabras previstas. La descarga nativa coincide por SHA con el export. El cierre de sesión revoca el acceso y limpia los datos privados de la vista. Esto es verificación instrumental/ASR y visual; no una aprobación humana de voz/acento.


## URL2Short: página a short vertical con Flow

Abre [URL2Short en tu panel](https://auroflow.club/app#url2short). El nodo lee
el HTML público, extrae bloques de texto, imágenes (URL y alt) y tablas con filas,
columnas y unidades, y prepara un guion editable. No ejecuta JavaScript, OCR ni
análisis visual de las imágenes, no recorre enlaces y no accede a contenido privado.
Lee como máximo 1 MB de HTML, 300 bloques y 64.000 caracteres de evidencia;
las tablas admiten hasta 100 filas por 20 columnas. Si llega a un límite, muestra
la fuente como incompleta. Una página larga se convierte en una selección editorial:
el panel enseña los bloques utilizados por cada toma y los que quedan fuera.
Este mapa no certifica hechos ni garantiza viralidad.

Los nuevos URL2Short crean por defecto un protagonista original al generar:
un retrato, una voz y un Character de Flow, una sola vez por short. Las tomas
reutilizan ese mismo personaje y voz; no se genera un clip de casting separado.
Antes de preparar el guion puedes elegir un personaje propio con su voz vinculada
(`cast_mode:"library"`, `character_id`) o pedir recursos sin presentador
(`cast_mode:"text"`). La elección queda fijada para ese guion; los borradores
anteriores conservan su preferencia. Preparar no crea el personaje ni genera tomas.

V1 usa exclusivamente Flow para vídeo y audio nativo; el montaje se calcula en el
nodo. El guion se prepara con Codex Luna medio sobre la cuota de la suscripción
existente, o con la IA local seleccionada. No usa claves de proveedores de pago,
voz externa, ni el renderer JavaScript. Si falta el motor o su cuota, se detiene;
no cambia a una API de pago. El Character y su voz vinculada reducen variación, pero no garantizan continuidad
perceptual. Sin presentador ni voz vinculada, el timbre puede variar. Las cifras se
comunican en la locución: Flow no garantiza tablas o rótulos exactos en la imagen.

El plan nuevo conserva `url2short.editorial_plan` con gancho desde el primer
segundo, desarrollo, revelación y cierre; y `url2short.continuity.bridges`, con
estados `entry` y `exit` concretos. La entrada de cada toma copia la salida de
la anterior. Son instrucciones de rodaje, no resultados observados. Ingredients
permite reutilizar personaje, voz e imagen de referencia de la fuente, sin fijar
el primer fotograma exacto. Cambiar los visuales invalida esos puentes automáticos:
el render conserva tu guion editado. Sigue siendo necesario revisar cada empalme,
la voz y el cumplimiento de la promesa inicial. No se garantiza retención o viralidad.
La estructura toma como orientación las guías oficiales de
[TikTok Creative Codes](https://ads.tiktok.com/business/en-US/creative-codes) y
[YouTube Shorts](https://blog.youtube/creator-and-artist-stories/youtube-shorts-deep-dive/),
consultadas el 01-11-2026; no son una certificación de rendimiento.

El panel distingue tomas individuales y montaje completo. Durante la preparación
muestra cuántas tomas están escritas y cuántas se han generado. Al terminar cada
toma puedes verla y descargarla; el MP4 final une todas. Las descargas usan título,
tipo, duración e identificador; la cabecera no impone `auro-video.mp4` ni otro
nombre que sustituya el elegido por el enlace.

Duraciones: 32, 48 o 56 segundos (4, 6 o 7 tomas de ocho segundos), siempre 9:16.
Estructuras: `pregunta`, `mito`, `historia`, `comparacion`, `tres`, `dentro`,
`escala`, `imposible`. Preparar no autoriza generar. Antes del render, revisa el
guion literal, las cifras y las referencias. Sólo utiliza contenido e imágenes
que puedas reutilizar. Las referencias PNG/JPEG/WebP seleccionadas se descargan
en el nodo al generar, con DNS público fijado en cada salto, máximo 5 MB por imagen,
y se importan de forma idempotente en tu cuenta; su SHA queda guardado.

La API y el MCP conservan el contrato Film y sus IDs:

```json
{
  "id": "film-short-mi-proyecto",
  "cost_max": 0,
  "workflow": "url2short",
  "source_url": "https://ejemplo.com/articulo",
  "short_recipe": "pregunta",
  "source_media_approved": true,
  "engine": "codex-luna-medium",
  "shots": 6,
  "aspect": "9:16",
  "cast_mode": "auto",
  "auto_render": false
}
```

Guarda el ID y esta intención antes de `POST /v1/films` o
`auroflow_plan_film {request: …}`. Consulta el mismo ID. Al terminar la preparación,
`project.url2short` contiene `snapshot`, `coverage`, duración y motor Flow.
`coverage.omitted_ids` identifica lo que queda fuera; `script_edited:true` exige
revisar de nuevo el mapa tras una edición. Puedes guardar el guion con el endpoint
Film habitual y su `revision`. Para generar expresamente:
`POST /v1/films/{id}/render` con `{revision, cost_max:0, cast_mode:"auto"}` (o la elección guardada).
Conserva coste vivo de Flow y plataforma exactamente 0, Agent desactivado, permisos,
saldo y cola de la cuenta; no garantiza ausencia de consumo de la suscripción.
Ante respuesta incierta, consulta el mismo ID y sus tomas, sin volver a generarlas.
Lista compacta específica: `GET /v1/films?compact=1&limit=20&workflow=url2short`.

Tu token de **Auroflow** está en [API y tokens](https://auroflow.club/app#developers):
activar, mostrar y copiar de nuevo, comprobar MCP y rotar el token permanente. El servidor almacena el digest;
la clave no se incrusta en el código publicado ni se guarda en localStorage.

## Películas y spots desde una URL o un resumen

El estudio de `/app#director` prepara una sinopsis con IA y un guion editable de
1–12 tomas de 8 segundos, en vertical `9:16` u horizontal `16:9`.
`GET /v1/film-studio` informa de los motores disponibles, `production_types`,
`aspects`, `production_brief_limits` y los límites de `spot_cta`. El modelo
privado del servidor no requiere una API de pago. Para nuevas producciones,
Codex `gpt-6-luna` con razonamiento `medium` (`engine: "codex-luna-medium"`) es
el único agente externo ofrecido. Antigravity está pausado para nuevas
solicitudes; conserva su instalación y los proyectos y recibos históricos.
`engine: "local"` queda para preparación local explícita; el modelo local de
revisión de audio continúa disponible según sus capacidades. La instalación
no acredita autenticación ni cuota; comprueba las capacidades actuales. No se
cambia de agente ni a una API de pago al fallar una operación. Nano Banana 2.1 puede crear una
referencia privada con coste visible 0; el servidor la guarda y crea el personaje
y su voz. También puedes usar un Character y su voz de tu biblioteca privada.

1. `POST /v1/films`: `id: film-…`, `cost_max: 0` y exactamente uno de
   `source_url` o `summary`. Elegir `engine: "codex-luna-medium"` para nuevas
   producciones; si se omite en un ID nuevo se aplica Codex. Los IDs existentes
   conservan su motor guardado, incluido el legado local. `local` sólo para
   preparación local explícita. Opcionales:
   `shots`, `aspect`, `style`,
   `language`, `dialogue_literals` (una cadena por toma, vacía si no hay diálogo),
   `production_type`, `objective`, `audience`, `call_to_action` y `character_direction`.
   Los diálogos fijados se conservan literalmente aunque el modelo los parafrasee.
   Sin `auto_render:true`, devuelve un borrador en cola. Con ese campo autoriza
   la cadena completa descrita en «Una película completa desde una URL».
2. `GET /v1/films/{id}/next`: orientación compacta sin ejecutar.
   `GET /v1/films/{id}` devuelve el proyecto completo. Cuando `state=draft_ready`,
   revisa `ai_summary`, `source`, `script` y los recibos del modelo.
3. `POST /v1/films/{id}/script`: guarda `{revision, cost_max:0, script}`. Un
   cambio concurrente devuelve409. Puedes editar las líneas propuestas por IA;
   los `dialogue_literals` y la CTA explícita de un spot permanecen fijados.
4. `POST /v1/films/{id}/render`: acción explícita `{revision, cost_max:0,
   cast_mode?, character_id?, voice_id?, voice_preset?, voice_performance?}`.
   Se comprueba propiedad del personaje/voz y coste cero de
   plataforma y Google. Cada toma conserva un ID estable y usa la cola común.
   El montaje final y la nivelación se hacen en el servidor. Consulta el mismo
   proyecto tras una respuesta incierta; no abras otro proyecto para reenviar.

La preparación tiene una cola propia durable:3 trabajos activos por cuenta,32
globales, prioridad protegida por el servidor y turnos entre cuentas de igual
prioridad. La generación conserva las reglas de la cola compartida de vídeo.
Se guardan hasta100 proyectos por cuenta. Las fuentes web se leen como datos,
sin ejecutar sus instrucciones, sin sesiones privadas ni acceso a redes
internas. Una página que no tenga texto público debe sustituirse por un resumen.

Para crear un anuncio, elige `production_type: "spot"`; si se omite, se conserva
el modo `film`. El brief se guarda y aparece en el proyecto:

| Campo | Contenido | Límite |
| --- | --- | --- |
| `objective` | Qué debe conseguir el spot. | 500 caracteres |
| `audience` | Público al que se dirige. | 500 caracteres |
| `call_to_action` | Frase final que debe pronunciar el protagonista. | En spots: 120 caracteres y 18 palabras |
| `character_direction` | Apariencia, vestuario y actitud de un protagonista original acorde con la web. | 1000 caracteres |

El guion del spot plantea un gancho, un beneficio verificable en la fuente y una
llamada a la acción. La IA recibe instrucciones de centrarse en el servicio y su
utilidad, omitir recetas de integración o personajes de demostración y no
inventar precios, descuentos, garantías, promociones o atributos. La dirección
del personaje guía también su retrato con Nano Banana; no acredita una mascota
oficial ni un embajador real. Revisa estas decisiones en el guion.

En un spot, una `call_to_action` explícita se conserva literalmente como diálogo
de la última toma. Aunque el campo genérico admite hasta 200 caracteres, se
rechaza para spots con `spot_cta_too_long` si supera 120 caracteres o 18 palabras:
no se trunca para hacerla caber. Si `dialogue_literals` fija un cierre distinto,
la petición falla con `spot_cta_dialogue_conflict` antes de preparar el guion.
Haz coincidir ambas frases o elige una única forma de fijar ese cierre.
El mismo contrato se aplica al editar el borrador: cambiar una CTA fijada
devuelve `spot_cta_dialogue_conflict`; cambiar otro diálogo de
`dialogue_literals` devuelve `film_literal_dialogue_conflict`. El guion y su
revisión no se modifican tras ese rechazo. Los diálogos que redactó la IA y que
no estén fijados se pueden editar, respetando la duración de las tomas.

## Escucha de películas con un modelo de audio

`POST /v1/film-reviews` recibe `{id:"review-…", sequence_id:"seq-…",
cost_max:0}`. Sólo revisa una película terminada y propiedad de la cuenta. El
servidor verifica la entrega, decodifica el audio completo y lo proporciona al
modelo, sin sustituirlo por una transcripción. Consulta
`GET /v1/film-reviews/{id}` para leer la valoración de voz, acento y continuidad,
el SHA de entrada, modelo/revisión y recibo de coste0. El botón «Revisar voz y
continuidad» está en los montajes del panel. La evaluación conserva su
incertidumbre; no acredita una identidad de voz ni una aprobación humana.
El límite de escucha completa es 120 segundos. La duración es medida por el
servidor. El modelo puede discrepar sobre el número de voces y el acento: los
campos `voice_continuity_verified` y `regional_accent_verified` permanecen
en `false`; una valoración terminada no aprueba ni regenera el vídeo.

Una negativa a escuchar, una plantilla, una descripción hipotética o una
valoración que afirma voz hablada sin aportar palabras transcritas devuelve
`state: "inconclusive"`, `perceptual_model_review: false` y
`audio_assessment_quality: {usable:false, reason:…}`. Se conservan el texto de
`assessment`, el recibo y sus SHA. Las respuestas históricas guardadas como
`completed` que sean de ese tipo se muestran como inconclusas al consultarlas;
la lectura no reescribe el registro histórico. `usable:true` sólo identifica
observaciones candidatas con el contenido hablado solicitado, o una declaración
explícita de ausencia de habla con observaciones sonoras. Una cita sobre el tono
«alegre» o «femenino» no cuenta como transcripción. El control es textual: no
demuestra escucha ni corrección, no acredita cobertura completa y no concede
aprobación. La incertidumbre sobre el acento no invalida una transcripción.

Con autorización para volver a revisar, usa
`POST /v1/film-reviews/{id}/recover` con el mismo ID de revisión y el cuerpo
`{"revision":4,"cost_max":0}`; reemplaza4 por su revisión observada. Por MCP:

```json
{
  "review_id": "review-ejemplo-spot-001",
  "request": {"revision": 4, "cost_max": 0}
}
```

Ese objeto corresponde a `auroflow_resume_audio_review`. Sólo admite una
revisión propia `inconclusive` o `failed`. Cada autorización crea un único
intento durable, conserva `audio_review_attempts` y reutiliza el WAV ya extraído
en el servidor: sus bytes deben coincidir con el SHA de audio, la película
guardada con su SHA y la secuencia actual terminada. No vuelve a generar vídeo,
descargar la película ni ejecutar FFmpeg. Si faltan archivos o cambian sus SHA,
se bloquea antes de inferir; no reconstruye la copia automáticamente.

Consulta el mismo ID si la respuesta es incierta. Repetir la misma autorización
no crea otro intento. Si el proceso se interrumpe durante la inferencia, el
intento queda `unconfirmed` y requiere otra autorización explícita con la
revisión nueva; no se repite solo. El límite es ocho intentos explícitos por
revisión. El modelo recibe primero la orden de transcribir palabras oídas y
marcar `[inaudible]`, después voz/acento/cortes/música. No recibe
`expected_dialogue` como pista y no utiliza una API de pago.

El MCP añade `auroflow_capabilities {area:"film_studio"}`, `auroflow_plan_film`, `auroflow_get`,
`auroflow_save_film_script`, `auroflow_render_film_zero`,
`auroflow_review_film_audio`, `auroflow_get` y
`auroflow_resume_audio_review`; para seleccionar un acabado de la película,
`auroflow_select_film_delivery`. Mantiene los controles
de cuenta, revisión, coste e idempotencia de REST; nunca ofrece acceso al
navegador, comandos ni rutas del servidor.

Codex comprueba su cuota ordinaria antes de cada inferencia y se detiene al
llegar al 90% de cualquier ventana o si no puede verificarla. No consume resets.
Las cuotas de los agentes pertenecen a las cuentas conectadas del servidor y
pueden agotarse; no se anuncian como inferencias ilimitadas.

Prueba conectada del 18-10-2026: cuenta ordinaria, guion creado en el panel
con Luna medio y diálogos fijos, tres tomas de Miga con Character y voz propios,
montaje y acabado en AUROFLOW; saldo Auro10→10 y Google25.050→25.050.
La entrega completada no equivale a aprobación humana de imagen o voz.

## Una película o un spot completo desde una URL

El estudio (`/app#director`) permite pegar una página pública, elegir película o spot, formato vertical u horizontal y reparto. La creación completa encadena resumen, guion, reparto y voz, tomas y montaje con acabado de audio en el servidor. El cliente recibe una entrega privada sin manejar Chrome ni unir archivos. En modo automático, `cast_mode=auto` crea una imagen privada con Nano Banana 2.1, guarda una voz y un Character nativo y los reutiliza en todas las tomas.

Ejemplo de cuerpo para `POST /v1/films`, o del campo `request` de
`auroflow_plan_film` en el MCP público. Es una petición de ejemplo; el ID debe
ser nuevo para cada proyecto autorizado:

```json
{
  "id": "film-ejemplo-spot-auroflow-001",
  "source_url": "https://auroflow.club/",
  "production_type": "spot",
  "objective": "Presentar el estudio de spots desde una URL y animar a probarlo.",
  "audience": "Pequeños comercios y creadores que quieren presentar su proyecto.",
  "call_to_action": "Crea tu primer spot en Auroflow.",
  "character_direction": "Una directora adulta, creativa y cercana, con chaqueta azul y vestuario coherente con el aspecto de la web. Personaje original, sin logos ni texto.",
  "engine": "codex-luna-medium",
  "shots": 3,
  "aspect": "9:16",
  "style": "Animación 3D cálida y expresiva",
  "language": "Español de España",
  "auto_render": true,
  "cast_mode": "auto",
  "voice_preset": "Aoede",
  "voice_performance": "Voz femenina adulta, cálida y natural. Español de España. Misma interpretación en las tres tomas.",
  "cost_max": 0
}
```

`auto_render=true` autoriza expresamente la cadena completa de generación. Para preparar y editar sólo el guion, omite ese campo o usa `false`; después guarda el guion con su `revision` y llama a `auroflow_render_film_zero`. `cast_mode=library` y `character_id` reutilizan un personaje de tu biblioteca; `cast_mode=text` describe la identidad en el prompt. Con reparto automático, un `voice_id` propio reutiliza una voz existente; sin él se crea una voz con el preset y la interpretación elegidos.

El ejemplo ya usa Codex Luna medio, único agente externo ofrecido para nuevas
producciones. Elige un ID nuevo para un proyecto nuevo; no cambies el motor de
una petición existente al recuperarla. Para un spot horizontal, elige
`aspect: "16:9"`. Para reutilizar un personaje existente, selecciónalo en la
biblioteca o envía `cast_mode: "library"` con su `character_id` observado.
Se comprueba que el Character y su voz vinculada sean de la cuenta; no se
sustituye su identidad por un retrato nuevo. Al comparar versiones de una URL,
comprueba también `source.sha256`: una web puede cambiar entre dos lecturas y
no constituir la misma fuente.

Consulta `auroflow_get` con el mismo `film_id`. Los estados son `queued`, `writing`, `draft_ready`, `rendering`, `completed`, `failed` y `action_required`. `casting` muestra las operaciones de imagen, voz y personaje, y su `image_url` privada; `jobs` conserva los IDs de cada toma. Al terminar, `sequence_id` y `video_url` identifican el montaje. La consulta y la descarga requieren la misma cuenta. Usa la URL devuelta: no construyas rutas locales ni URLs de Flow.

Si se interrumpe, `auroflow_resume_film` acepta `film_id` y `request` con `revision` observada y `cost_max:0`. Consulta y recupera los mismos IDs; no repite una generación que ya tenga intención de envío. Antes de enviar cualquier toma se puede usar `refresh_script:true` para volver a leer la fuente, conservando la identidad de una imagen ya creada. Si todavía no se ha creado la voz, se pueden corregir `voice_preset` y `voice_performance`. La web ofrece recuperación sobre el propio proyecto.

También se puede crear sólo la imagen: `auroflow_create_image`, con `request` que contenga un `id` estable `lib-…`, `display_name`, `prompt`, `approved:true` y el entero `cost_max:0`. Consulta `auroflow_get`; al completar devuelve `resource.upload_id`, SHA, dimensiones y `image_url`. Ese `upload_id` se puede usar en `auroflow_create_character` con una voz propia. La imagen es privada y comparte cola y prioridad autenticadas con los otros recursos. Su recuperación utiliza `auroflow_recover` y nunca vuelve a enviar una generación ya despachada.

Cada imagen comprueba físicamente proyecto/cuenta, Nano Banana 2.1, Imagen/1:1/x1, ausencia de referencias, Agent desactivado y coste visible exactamente 0. Cada vídeo vuelve a comprobar su propio perfil y coste; la cotización de Auroflow también debe ser 0. Una discrepancia bloquea el envío. El coste de las suscripciones del servidor y las condiciones futuras de la promoción son independientes de estos recibos de generación a 0.

El flujo actual usa un protagonista nativo con su voz por película, hasta 12 tomas fuente de 8 segundos. Conserva las frases fijadas por el usuario y mantiene IDs de imagen y voz; no garantiza una identidad acústica, acento, factualidad o decorado perfectos. Revisa el guion y la entrega. La revisión de audio por modelo está disponible y conserva su incertidumbre; no concede aprobación humana.

## Ads con duración de entrega exacta

El panel `/app#ads` tiene un brief propio de anuncios. Por REST/MCP se usa el
mismo director de películas, con `production_type: "spot"`, `ad_preset` y
`target_duration_seconds`. Consulta `GET /v1/film-studio` o
`auroflow_capabilities {area:"film_studio"}`: `ads.presets` indica las combinaciones disponibles.

| `ad_preset` | Duraciones de entrega | Aspectos disponibles |
| --- | --- | --- |
| `youtube-bumper` | 6 s | 16:9 |
| `youtube-in-stream` | 15 / 30 / 60 s | 16:9 / 9:16 |
| `youtube-shorts` | 15 / 30 / 60 s | 9:16 |
| `facebook-feed` | 15 / 30 / 60 s | 16:9 |
| `facebook-reels` | 15 / 30 / 60 s | 9:16 |
| `instagram-reels` | 15 / 30 / 60 s | 9:16 |
| `instagram-stories` | 15 s | 9:16 |
| `tiktok-in-feed` | 15 / 30 / 60 s | 9:16 inicial / 16:9 |
| `linkedin-feed` | 15 / 30 / 60 s | 16:9 inicial / 9:16 |
| `x-vertical` | 15 / 30 / 60 s | 9:16 |

Estos son los cortes disponibles en Auroflow. Los tiempos oficiales del formato
se muestran por separado en el panel y en `ads.presets[].official_duration`,
con fecha de comprobación, condiciones y enlaces de la plataforma.

Comprobación de fuentes oficiales: **19 de octubre de 2026**.

| Formato | Duración oficial | Recomendación o condición |
| --- | --- | --- |
| [YouTube bumper](https://support.google.com/google-ads/answer/2375464) | 5–6 s | Auroflow entrega 6 s. |
| [YouTube in-stream saltable](https://support.google.com/google-ads/answer/2375464) | Sin máximo publicado para este formato | Google recomienda menos de 3 minutos. No se aplica al in-stream no saltable. |
| [YouTube Shorts](https://support.google.com/google-ads/answer/16041697) | Archivo de hasta 3 minutos | Esta guía indica 60 s de reproducción en el feed y recomienda menos de 60 s; campañas de acción recomiendan 10–30 s. Comprueba el subtipo de campaña. |
| [TikTok Non-Spark In-Feed](https://ads.tiktok.com/resources/help/article/tiktok-auction-in-feed-ads?lang=en) | Hasta 10 minutos | La guía consultada no publica un mínimo. Spark Ads usa otras condiciones. |
| [LinkedIn Video Ads](https://www.linkedin.com/help/linkedin/answer/a424737/video-ads-advertising-specifications) | 3 s–30 minutos | Para feed/Audience Network recomienda 15–30 s. In-stream tiene otras especificaciones. |
| [X Vertical Video Ads](https://business.x.com/en/products/vertical-video-ads) | Hasta 2 min 20 s | La página del producto recomienda 15 s y [Help](https://help.x.com/en/business-and-advertising/creative-ad-specifications) menos de 15 s; ambas recomendaciones se distinguen del límite. |
| Facebook Feed / Reels e Instagram Reels / Stories | Límite oficial pendiente de confirmar | Las guías de Meta exigieron acceso durante esta comprobación. No se presenta un límite desconocido como ilimitado; consulta la [guía del destino](https://www.facebook.com/business/ads-guide). |

Estos límites no habilitan automáticamente duraciones adicionales en Auroflow ni
garantizan la aceptación de una campaña. La API diferencia un límite numérico,
un límite del archivo subido, un formato sin máximo publicado y un dato no
confirmado. `platform_maximum_seconds` sólo contiene un máximo numérico del
formato; para interpretar ausencias consulta siempre `official_duration`.
La exportación actual admite 720p en 16:9 y 9:16; no ofrece formatos 1:1 ni 4:5.

[TikTok Non-Spark In-Feed](https://ads.tiktok.com/resources/help/article/tiktok-auction-in-feed-ads?lang=en)
admite ambas resoluciones actuales, con vertical como elección inicial en Auroflow.
[LinkedIn Video Ads](https://www.linkedin.com/help/linkedin/answer/a424737/video-ads-advertising-specifications)
admite horizontal y vertical; recomienda 15–30 segundos, y 60 es una opción editorial.
[X Vertical Video Ads](https://business.x.com/en/products/vertical-video-ads)
ofrece aquí 9:16, con 15 segundos iniciales. Estos presets preparan archivos;
no conectan cuentas publicitarias ni publican campañas. Comprueba peso, bitrate,
audio, zona segura y previsualización en el destino antes de publicar. No se ha
realizado una subida de prueba a sus gestores de anuncios.

Ejemplo para preparar un borrador de 15 segundos, sin generar todavía:

```json
{
  "id": "film-ejemplo-ad-15-001",
  "production_type": "spot",
  "ad_preset": "instagram-reels",
  "target_duration_seconds": 15,
  "source_url": "https://auroflow.club/",
  "objective": "Mostrar cómo preparar un spot desde una URL.",
  "audience": "Pequeños comercios",
  "call_to_action": "Crea tu primer spot en Auroflow.",
  "aspect": "9:16",
  "engine": "codex-luna-medium",
  "auto_render": false,
  "cost_max": 0
}
```

El servidor calcula las tomas; omite `shots` o envía exactamente ese cálculo.
6s usa una toma fuente de 8s conservando 0–6. 15s usa dos tomas conservando
0–7,5 en cada una; 30s usa cuatro y 60s ocho. Los originales de 8s se conservan.
`delivery_plan` muestra cada segmento, su ventana de habla prevista y sus
límites. Para 6s son 10 palabras/70 caracteres; para segmentos de 7,5s son
13 palabras/91 caracteres. La CTA se conserva literal como último diálogo.
Si no cabe, la petición o el guardado se rechaza antes de generar: el servidor
no acelera el audio ni corta el texto para hacerlo encajar.

La ventana declarada es una instrucción de producción, no una medición del
habla resultante. `speech_timing_verified:false` y `review_required:true`
permanecen explícitos. Revisa el vídeo y su audio completos, en especial la
CTA y los cortes; el modelo puede exceder un tiempo aunque el texto sea breve.
La revisión de audio por modelo no equivale a aprobación humana ni publicación
automática. El montaje comprueba su duración final antes de marcar el anuncio
terminado. Las mismas comprobaciones de coste 0, propiedad, revisión y
recuperación de IDs siguen vigentes.

Un proyecto antiguo sin `ad_preset` ni `target_duration_seconds` conserva su
montaje de ocho segundos por toma. Nunca se reinterpretan sus duraciones ni
se reenvían sus tomas al abrirlo desde Ads.

## Elegir un reencuadre o acabado como entrega de la película

Tras terminar un montaje con las herramientas de reencuadre y acabado del
servidor, puedes seleccionarlo como entrega del proyecto desde la web, REST o
MCP. `POST /v1/films/{id}/delivery` recibe `revision`, `sequence_id` y el entero
`cost_max:0`. Por MCP usa `auroflow_select_film_delivery`, por ejemplo:

```json
{
  "film_id": "film-ejemplo-spot-auroflow-001",
  "request": {
    "revision": 18,
    "sequence_id": "seq-ejemplo-spot-acabado-001",
    "cost_max": 0
  }
}
```

Sustituye esos IDs y la revisión por los observados en tu cuenta. La película
debe estar terminada y la secuencia seleccionada debe ser propia, completada
y tener vídeo privado disponible con SHA. Sólo se admite un acabado local del
servidor que conserve exactamente los jobs originales y su orden, variante 1,
sus trims originales, aspecto, duración final y audio nativo. En películas
anteriores los trims son 0–8; en Ads son los de `delivery_plan`. Puedes
cambiar reencuadre, nivelación o fundidos; no sustituir tomas ni cambiar su
duración mediante esta selección. No se recibe una URL de vídeo del cliente.

La selección cambia `sequence_id`, `video_url` y `delivery_sha256` del proyecto.
Conserva `original_sequence_id`, el historial `delivery_history` con IDs y SHA
de origen/destino, y el guion, reparto y jobs originales. No genera ni vuelve
a montar nada. Repetir la misma autorización no añade otra entrada ni cambia
de nuevo la entrega; elegir otra secuencia con esa misma revisión devuelve 409.
Usa la revisión actual para una nueva selección. El límite es 32 cambios por
película; seleccionar la entrega que ya está activa no escribe un cambio.

Una revisión de audio permanece ligada a su `sequence_id` y SHA originales.
Seleccionar otra entrega no traslada aprobación ni revisión de la anterior.
Si quieres evaluar el nuevo acabado, crea una revisión de audio para la
secuencia actualmente seleccionada. El historial anterior sigue disponible.


Para una referencia de continuidad extraída de un vídeo propio ya terminado,
utiliza `auroflow_extract_reference_frame` o `POST /v1/native-reference-frames`
con ID `lib-...` estable, SHA fuente, variante y número exacto de fotograma. La
operación no genera ni infiere: crea un upload privado en el servidor a coste
cero y conserva procedencia. Se puede añadir como entorno de Ingredients con el
mismo Character y voz. Esto guía el estado del libro, fondo y encuadre; requiere
revisión visual y no implica el modo Frames con voz nativa ni una aprobación.


## Capas gráficas editables

Guarda títulos e infografías como una pista versionada separada del vídeo.
Cambiar un texto usa parches pequeños y compone desde las fuentes originales,
sin regenerar Flow. Web: /app#motion; guía y herramientas MCP:
[graphics-layers.md](https://auroflow.club/graphics-layers.md).
Consulta la skill [auroflow-graphics-layers](https://auroflow.club/skills/auroflow-graphics-layers/SKILL.md)
para decidir cuándo aportan valor, conservar planos limpios y evitar subtítulos
automáticos o datos inventados. Límites actuales: 1–60 s por pista; MP4 opaco,
sin exportación alfa. Guardar/editar no renderiza ni llama a modelos.

`auroflow_capabilities {area:"graphics_styles"}` y `GET /v1/graphics/styles` publican los presets;
`auroflow_suggest_graphics` acepta `style` y `style_prompt` con interpretación
limitada y devuelve directivas no resueltas. Cambiar texto, color o animación
usa un parche con revisión esperada, conservando vídeo y audio.


## Voces y locución independiente con Vids

Para el recorrido conjunto de vídeo propio, locución y capas versionadas,
consultar [narración y acabado](https://auroflow.club/production-finishing.md).
`auroflow_capabilities {area:"production"}` distingue implementación, validación de
runtime y disponibilidad de proveedores. `auroflow_plan_finishing` prepara
un recorrido puro con la misma petición tipada que las capas gráficas.
Un WAV `tts-` propio terminado se utiliza como `audio.source.kind:narration`,
con comprobación de propietario y SHA. `audio.tracks` mezcla hasta ocho
capas de música propia, locución y sonido de tomas con posición, recorte,
volumen, fundidos y silencio. El audio explícito sustituye al de la base;
inclúyelo como otra pista para conservarlo. Leer la
[skill de montaje](https://auroflow.club/skills/auroflow-editing/SKILL.md),
disponible también como recurso MCP con descubrimiento `editing`.
Editar textos o mezcla conserva vídeo y voz. Para producir audio independiente,
leer [la guía de audio](https://auroflow.club/audio-production.md) y la
[skill de producción de audio](https://auroflow.club/skills/auroflow-audio-production/SKILL.md),
publicadas en la versión `2026.10.24.5` del
[manifiesto](https://auroflow.club/skills/manifest.json). El perfil MCP `audio`
ofrece 14 herramientas; se descubre con
`tools/list` y `params:{"_meta":{"auroflow/toolset":"audio"}}`.

`auroflow_queue {}` incluye actividad propia de locución, música y medios
nativos en `queue.auxiliary_items`. Sus contadores son `auxiliary_pending` y
`auxiliary_attention_required`; posiciones y ETA permanecen sin confirmar.
Una cola Flow vacía no implica audio terminado. Leer cola y el mismo trabajo
no inicia ni recupera la síntesis.

La música nativa de Vids tiene plan y generación propios:
`auroflow_plan_music` y `auroflow_generate_music_zero`, con ID estable `mus-`,
`approved:true` y `cost_max:0`. `duration_mode:clip` utiliza Lyria 3 y
`full_song`, Lyria 3.5; sus duraciones aproximadas son 30 y 180 segundos,
no una duración exacta garantizada. Leer `features.vids_music` en las
capacidades vivas antes de enviar: la disponibilidad del proveedor puede
cambiar. Este recorrido es distinto del proveedor Flow Music.

Para una mezcla WAV independiente usar `auroflow_plan_audio_mix` y
`auroflow_create_audio_mix`: fuentes propias terminadas `narration` y `music`,
ID `mix-` persistido, hasta ocho pistas y `cost_max:0`. La mezcla no sintetiza
ni modifica los WAV fuente. Consultar o recuperar el mismo trabajo con
`auroflow_get` o `auroflow_recover`; conservar SHA y bytes.

La [galería de voces](https://auroflow.club/voces) compara 37 identidades nativas con la misma frase en español, reproducción y descarga WAV. Escuchar las muestras existentes no genera trabajos. Consulta la [referencia de voces](https://auroflow.club/skills/auroflow-audio-production/references/vids-voices.md) o el [contrato completo de voces](https://auroflow.club/vids-voices.md).

Los tools públicos `auroflow_capabilities {area:"vids_voices"}`, `auroflow_plan_narration`, `auroflow_generate_narration_zero`, `auroflow_get`, `auroflow_list {kind:"narrations"}` y `auroflow_recover` están disponibles en `audio`, `full` y `film`. Cada usuario utiliza su propia credencial. Las locuciones nuevas y sus WAV son privados, con ID estable `tts-`, texto literal de hasta 2400 caracteres y `cost_max: 0`. La autorización del usuario se declara con `approved: true` al generar; un plan no autoriza ni comprueba el precio vivo.

El envío exige la misma cuenta incluida de Vids y coste vivo 0 créditos Google, 0 créditos Auroflow y 0 dinero. No se permiten compras, recargas ni alternativas de pago. Cada trabajo crea un Vids vacío independiente y exporta el MP4 nativo una sola vez para derivar PCM WAV, comprobar duración e integridad y servir la descarga autenticada. Hay un límite de 3 trabajos pendientes y 40 locuciones por cuenta en 24 horas. Un trabajo incierto se consulta o recupera con el mismo ID; la recuperación no sintetiza.

Si falló la primera preparación antes de enviar, usa
`auroflow_recover {id,action:"resume_preparation",cost_max:0}` con el mismo
ID `tts-` de locución o `mus-` de música. Exigen prueba nativa de la misma intención,
cuenta y documento, sin submit, ACK ni resultado incierto previo; datos
desconocidos bloquean. La admisión en cola no acredita esa prueba. Tras
incertidumbre consultar el mismo ID; no repetir ciegamente la reanudación.
La recuperación ordinaria de voz y música sigue siendo solo recogida del
envío original.

La opción `experimental_spanish_spain` está desactivada por defecto. Añade `[español de España]` al final del guion manteniendo la voz, pero podría ignorarse o pronunciarse literalmente. El catálogo observado no certifica el acento regional: hay que escuchar cada resultado antes de aprobarlo.


## Medios nativos adicionales

Para vídeo nativo de Vids y NotebookLM, consulta [el contrato de medios nativos](https://auroflow.club/native-media.md) y `auroflow_capabilities {area:"native_media"}`. Flow Music sigue bloqueado si su precio nativo no acredita 0 créditos; sus créditos incluidos no se convierten en coste cero. Usa IDs `nm-`, la misma cuenta y recuperación sin reenvío.
