# Gestionar FlowStreams con la API de Flow

> Inicia sesión, lista, crea, importa, exporta, pausa, reinicia y elimina FlowStreams con la API JSON en /fapi/, lee las estadísticas y las variables y llama a un flujo desde fuera con su dirección notify o su propia ruta proxy.

Framework: flow
Product: Flow (flow@11.1)
Language: es
Content-SHA256: dc51473752c6b5b59effdadff22370f5da1c3b68bff36afc1a72a14881809791
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Todo lo que hace el editor pasa por un único endpoint JSON: `POST /fapi/` con el cuerpo `{ "schema": "<name>", "data": { ... } }` (las rutas API de Total.js, consulta [rutas API](/en/total5/api-routes/)). La dirección `/fapi/` sale de la línea `$api : /fapi/` del archivo `config`. Todas las llamadas salvo el inicio de sesión necesitan la cookie de sesión; sin ella la respuesta es `401: Unauthorized`.

Estas llamadas también se probaron contra un Flow 11.1 local (Node.js 24 y `total5@0.0.19`) mientras se escribía esta página.

## Iniciar sesión

`Auth|login` recibe `login` y `password` y responde `{"success":true}` con la cookie de sesión. Un par incorrecto responde `Invalid credentials`.

```bash
curl -c cookie.txt -X POST http://localhost:8000/fapi/ \
  -H 'content-type: application/json' \
  -d '{"schema":"Auth|login","data":{"login":"<your login>","password":"<your password>"}}'
```

Las siguientes llamadas usan `-b cookie.txt`.

## Las llamadas

| `schema` | `data` | Qué hace |
|---|---|---|
| `Streams` | ninguno | la lista de FlowStreams con `id`, `name`, `group`, `author`, `version`, `proxypath`, `size` y las `stats` en vivo de los que se están ejecutando |
| `Streams\|save` | `name`, y opcionalmente `author`, `version`, `icon`, `color`, `group`, `url`, `reference`, `readme`, `memory`, `cloning`, `proxypath`, `proxytimeout` | **crea** un flujo cuando falta `id` (se comprueba el permiso *create*); si no, actualiza el flujo con ese `id` y lo reinicia |
| `Streams\|read` | `id` | las propiedades de un flujo |
| `Streams\|raw` | `id` | el objeto completo del flujo, con su diseño |
| `Streams\|export` | `id` | el flujo como texto JSON en `value`, sin los campos internos (`unixsocket`, `env`, `import`, `worker`, `asfiles`) |
| `Streams\|import` | `data` (el texto JSON) | crea un flujo **nuevo** a partir de una exportación (hasta 10 MB), con un `id` nuevo; un `proxypath` repetido se sustituye por uno aleatorio; responde `{"success":true,"value":"<id>"}` |
| `Streams\|pause` | `id`, `is` (`true` o `false`) | pausa o reanuda un flujo en ejecución |
| `Streams\|restart` | `id` | reinicia el flujo |
| `Streams\|remove` | `id` | elimina el flujo y su carpeta (se comprueba el permiso *remove*) |
| `Streams\|stats` | ninguno | los totales de la instalación: versiones de Node.js, Total.js y Flow, mensajes, pendientes, memoria y conexiones |
| `Variables\|read` / `Variables\|save` | `id` (opcional), `data` | las variables de un flujo, o las variables **globales** cuando `id` está vacío; al guardar se envían a los flujos en ejecución |
| `Console\|read` / `Console\|clear` | ninguno | la consola de la aplicación |
| `CDN\|clear` | ninguno | borra la caché de los componentes de la interfaz descargados |
| `Settings\|read` / `Settings\|save` | los ajustes (consulta [ajustes y archivos](/en/flow/settings-and-files/)) | solo para el superadministrador |

## Crear un flujo y ejecutarlo

Créalo y luego importa un diseño construido en el editor (un archivo JSON exportado) para iniciarlo:

```bash
curl -b cookie.txt -X POST http://localhost:8000/fapi/ \
  -H 'content-type: application/json' \
  -d '{"schema":"Streams|save","data":{"name":"Demo","author":"Me"}}'
```

Un flujo exportado desde el editor lleva su `design` (las cajas y sus conexiones), sus `components` (el código de cada una) y sus `variables`.

## Reglas de `proxypath`

Un flujo puede publicar rutas HTTP bajo una ruta propia. Flow añade las barras (`demo` pasa a ser `/demo/`), rechaza las rutas que pertenecen a Flow (`/`, `/cdn/`, `/fapi/`, `/private/`, `/flows/`, `/designer/`, `/parts/`, `/forms/`, `/css/`, `/js/`, `/fonts/`, `/panels/`) con `Proxy endpoint contains reserved path` y rechaza una ruta que ya use otro flujo. `proxytimeout` es el tiempo en segundos que se espera la respuesta del flujo (por defecto `120`).

## Llamadas desde fuera

| Ruta | Uso |
|---|---|
| `GET` o `POST /notify/{id}/` | envía una notificación al flujo con ese id (el cuerpo del POST está limitado a 1 MB); los componentes del flujo deciden qué hacer con ella. Responde `{"success":true}` |
| `+SOCKET /{id}/` | el WebSocket del editor para ese flujo (necesita la sesión) |
| `GET /private/?token=<token>` | lista los archivos de la carpeta `private/` cuando el token coincide con el `token` de los ajustes; diez tokens erróneos bloquean una dirección durante 15 minutos |
| `+POST /update/` | actualiza la aplicación desde un archivo `.bundle`; solo para la versión empaquetada |

Mantén el `token` en secreto, envía estas llamadas por HTTPS y pon Flow detrás de un proxy inverso cuando sea accesible desde Internet.
