API Local
<- volver a la raíz del documento
¿Qué hace la API Local?
Audio Forge incluye un pequeño servidor integrado que se ejecuta en tu máquina. Permite que herramientas externas, como un plugin de Elgato Stream Deck, un script personalizado o cualquier aplicación en tu PC, controlen la reproducción a través de HTTP o WebSocket, sin necesidad de software adicional.
Si ya utilizas la integración de MQTT, la API Local admite los mismos comandos exactos. La diferencia es que se ejecuta completamente en tu máquina sin ninguna configuración: no se necesita instalar un broker, ni configurar una red.
Habilitar la API Local
Ve a Configuración → Control externo → API Local y asegúrate de que la función esté habilitada (por defecto, está activada).
Puedes configurar:
- Activado (por defecto: activado).
- Número de Puerto (por defecto: 8329).
- Escuchar en LAN (por defecto: desactivado). Cuando está activado, los dispositivos en tu red local pueden acceder a la API. Cuando está desactivado, solo el software en la misma máquina puede conectarse.
- Clave de API (generada automáticamente). Requerida al conectarse desde otro dispositivo en la red. Puedes copiarla o regenerarla desde Configuración.
Una vez habilitada, Audio Forge escucha en http://localhost:8329. Si “Escuchar en LAN” está activado, escucha en todas las interfaces de red.
Primeros pasos
Abre una terminal e intenta:
# See what's playing right now
curl http://localhost:8329/api/state
# List every library and category
curl http://localhost:8329/api/catalog
# List one-shot Echo sounds that are playing now
curl http://localhost:8329/api/echoes/active
# Play a category
curl -X POST http://localhost:8329/api/command ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
Eso es todo, si Audio Forge se está ejecutando con la API Local habilitada, recibirás respuestas en formato JSON inmediatamente.
Puntos finales HTTP
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/state | Estado de reproducción actual |
| GET | /api/catalog | Catálogo completo de bibliotecas y categorías |
| GET | /api/echoes/active | Sonidos de un solo disparo Echo que se están reproduciendo actualmente |
| POST | /api/command | Ejecutar un comando (cuerpo JSON) |
GET /api/state
Devuelve una instantánea JSON de lo que Audio Forge está haciendo en este momento:
{
"libraryUuid": "...",
"libraryName": "[Default]",
"musicPlaying": true,
"ambiancePlaying": false,
"musicVolume": 0.75,
"ambianceVolume": 0.5,
"echoesVolume": 1.0,
"musicCategories": [{"uuid": "...", "name": "Battle"}],
"ambianceCategories": [{"uuid": "...", "name": "Rain"}],
"lastEcho": {"uuid": "...", "name": "Thunder", "at": "2025-06-01T12:34:56Z"},
"categoryVolume": {"<uuid>": 0.5}
}
Todos los campos de volumen utilizan la escala de visualización de la aplicación, desde 0.0 hasta 1.0.
Para Música y Ambiente, 0.5 es el volumen normal (unidad) y 1.0 es el
máximo aumentado. Para Echoes, 1.0 es el volumen normal.
categoryVolume contiene valores de tiempo de ejecución actuales y puede ser escaso. Utiliza el volume de cada
categoría desde /api/catalog cuando necesites un valor completo para cada categoría, incluidas las categorías que aún no se han utilizado.
GET /api/catalog
Devuelve cada biblioteca con sus categorías de Música y Ambiente:
{
"activeLibraryUuid": "...",
"libraries": [
{
"uuid": "...",
"name": "[Default]",
"music": [{
"uuid": "...",
"name": "Battle",
"enabledInForge": true,
"trackCount": 3,
"volume": 0.5
}],
"ambiance": [{
"uuid": "...",
"name": "Rain",
"enabledInForge": false,
"trackCount": 0,
"volume": 0.5
}]
}
]
}
enabledInForgeindica si la categoría es visible y está habilitada en Forge.trackCountes el número de pistas reproducibles instaladas actualmente para esa categoría.volumees el volumen efectivo de la categoría en la escala0.0a1.0. Está presente para cada categoría, incluidas las categorías inactivas.
Para una categoría activa, el catálogo informa su volumen de ejecución actual. Para una
categoría inactiva, informa el volumen objetivo configurado, o 0.5 cuando no
existe un objetivo. Los ajustes de ejecución no reemplazan el objetivo configurado.
Cuando una categoría se reinicia, se utiliza un valor de comando explícito si está presente;
de lo contrario, se utiliza el objetivo configurado. El ajuste de ejecución anterior no se
reutiliza. Restaurar un Enlace de Estado aplica los volúmenes de ejecución registrados en ese
enlace.
GET /api/echoes/active
Devuelve una instantánea de cada sonido de un solo disparo Echo que se está reproduciendo actualmente. Los disparos simultáneos se devuelven como entradas separadas, incluso si utilizan la misma categoría o archivo de sonido.
{
"count": 1,
"sampledAt": "2026-07-24T12:00:02.500Z",
"echoes": [
{
"playbackId": "7b304347-410f-4eaf-bad7-4e8488778302",
"categoryUuid": "2e4d51f1-11ce-46af-a411-0c6bc2c420cb",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-07-24T12:00:00.000Z",
"durationMs": 10000,
"positionMs": 2500,
"remainingMs": 7500,
"progress": 0.25,
"progressPercent": 25.0,
"playing": true,
"processingState": "ready"
}
]
}
playbackIdidentifica de forma única este disparador específico. Dos reproducciones superpuestas del mismo categoría reciben diferentes ID.sampledAtes cuándo Audio Forge generó la instantánea. Los valores de posición no se transmiten continuamente, por lo que los clientes deben solicitar una nueva instantánea cuando necesiten el progreso actual.durationMs,remainingMs,progressyprogressPercentsonnullcuando la duración del sonido no está disponible.progressutiliza una escala0.0a1.0.progressPercentutiliza0.0a100.0.fileNamecontiene solo el nombre del archivo, nunca una ruta del sistema de archivos local.- Los sonidos Echo terminados o detenidos se eliminan de la lista.
Los Echo comparten el valor global echoesVolume devuelto por /api/state. No hay un volumen de Echo por reproducción o por categoría.
POST /api/command
Envía un comando JSON en el cuerpo de la solicitud. En caso de éxito:
{"ok": true, "message": "play ok"}
En caso de error:
{"ok": false, "error": "category not found"}
WebSocket
Para herramientas que desean actualizaciones en tiempo real (como un plugin de Stream Deck que necesita mostrar el estado actual), conéctate a un WebSocket en:
ws://localhost:8329/ws
Enviar comandos
Envía los mismos objetos de comando JSON que enviarías a /api/command:
{"command": "play", "section": "Music", "categoryName": "Battle"}
El servidor responde con un mensaje de resultado para cada comando.
Recibir actualizaciones
El servidor envía automáticamente actualizaciones cada vez que algo cambia. Cada mensaje tiene un campo type:
| tipo | Cuándo se envía | Qué contiene |
|---|---|---|
state | Al conectarse y cada vez que cambia la reproducción | Igual que GET /api/state |
catalog | Al conectarse y cuando cambian las bibliotecas | Igual que GET /api/catalog |
result | Después de cada comando que envías | ok, message o error, requestId |
echo | Cuando se activa un sonido Echo | uuid, name, at |
Las actualizaciones de estado se rebotan (250 ms) para que no se te inunde durante los cambios rápidos, como los barridos de volumen.
Los mensajes son objetos JSON planos. La carga útil no está anidada debajo de un campo data o
payload. Ejemplos:
{"type": "state", "musicPlaying": true, "ambiancePlaying": false,
"musicVolume": 0.5, "ambianceVolume": 0.5,
"musicCategories": [], "ambianceCategories": [], "categoryVolume": {}}
{"type": "catalog", "activeLibraryUuid": "<uuid>", "libraries": []}
{"type": "result", "ok": true, "message": "play ok", "requestId": "request-1"}
{"type": "echo", "uuid": "<uuid>", "name": "Thunder",
"at": "2026-07-18T12:34:56Z"}
Comandos
Todos los comandos utilizan el mismo esquema JSON que la integración de MQTT. Cada comando acepta una cadena requestId opcional que puedes utilizar para hacer coincidir las respuestas.
play
Reproducir o reanudar una sección, o seleccionar una categoría específica.
{"command": "play", "section": "Music"}
{"command": "play", "section": "Music", "categoryName": "Battle"}
{"command": "play", "section": "Ambiance", "categoryUuid": "<uuid>"}
- Sin una categoría: reanuda toda la sección.
- Con una categoría: selecciona y reproduce.
- El Ambiente utiliza semántica de alternancia. Reproducir una categoría de Ambiente ya activa la desactiva.
pause
{"command": "pause", "section": "Music"}
stop
{"command": "stop", "section": "Ambiance"}
setActiveLibrary
Cambiar la biblioteca activa por UUID o nombre.
{"command": "setActiveLibrary", "libraryName": "My Library"}
{"command": "setActiveLibrary", "libraryUuid": "<uuid>"}
setVolume
Establecer el volumen para toda la sección, o para una categoría específica dentro de una sección. Utiliza value de 0.0 a 1.0, o de 0 a 100 con valueScale: percent.
{"command": "setVolume", "section": "Music", "value": 1.0}
{"command": "setVolume", "section": "Music", "value": 75, "valueScale": "percent"}
{"command": "setVolume", "section": "Echoes", "value": 0.5}
{"command": "setVolume", "section": "Ambiance", "value": 0.5,
"categoryName": "Rain", "transitionMs": 1000}
El transitionMs opcional controla la rapidez con la que el volumen se desvanece al nuevo nivel (por defecto: 500 ms).
La Música y el Ambiente utilizan la misma escala de visualización que la aplicación: 0.5 es el volumen
normal (unidad) y 1.0 es el máximo aumentado. Los Echo no tienen un rango aumentado, por lo que 1.0 es el volumen normal. La API convierte estos valores de visualización en la ganancia de reproducción interna automáticamente.
nextTrack
Saltar a la siguiente pista en una categoría de Música o Ambiente activa. La categoría debe estar reproduciéndose.
{"command": "nextTrack", "section": "Music", "categoryUuid": "<uuid>"}
{"command": "nextTrack", "section": "Ambiance", "categoryName": "Rain"}
playEcho
Activar un sonido Echo de un solo disparo.
{"command": "playEcho", "categoryName": "Thunder"}
{"command": "playEcho", "section": "Ambiance", "categoryUuid": "<uuid>"}
Si el comando se ejecuta correctamente, espera hasta que la reproducción de Echo esté registrada y devuelve sus campos de seguimiento y reproducción:
{
"ok": true,
"message": "echo played",
"requestId": "play-thunder",
"playbackId": "<playback-id>",
"categoryUuid": "<category-uuid>",
"categoryName": "Thunder",
"fileName": "thunder-01.wav",
"startedAt": "2026-08-09T12:00:00.000Z",
"durationMs": 4000,
"positionMs": 0,
"remainingMs": 4000,
"progress": 0.0,
"progressPercent": 0.0,
"playing": true,
"processingState": "ready"
}
Utiliza el playbackId devuelto con stopEcho para detener solo esta
instancia de reproducción. También puedes actualizar los valores actuales con
GET /api/echoes/active.
stopEcho
Detener la reproducción activa de Echo utilizando exactamente un selector:
{"command": "stopEcho", "playbackId": "<playback-id>"}
{"command": "stopEcho", "categoryUuid": "<category-uuid>"}
{"command": "stopEcho", "categoryName": "Thunder"}
playbackIddetiene solo esa instancia de reproducción. Obtén los ID de reproducción deGET /api/echoes/active.categoryUuiddetiene todos los Echo activos de esa categoría.categoryNamedetiene todos los Echo activos cuya categoría tenga exactamente ese nombre. Si las categorías en varias bibliotecas comparten el mismo nombre, se detendrán todas las coincidencias.- El resultado incluye
stoppedCount. Un selector sin coincidencias activas tiene éxito constoppedCount: 0. - Para detener todos los Echo activos independientemente de la categoría, utiliza
{"command": "stop", "section": "Echoes"}.
setCategoryEnabled
Habilitar o deshabilitar explícitamente una categoría en una sección.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true}
Puedes habilitar una categoría y establecer su volumen de forma atómica incluyendo value.
Si value se omite, se utiliza el volumen objetivo configurado de la categoría. Un
ajuste de ejecución anterior no se reutiliza.
{"command": "setCategoryEnabled", "section": "Ambiance",
"categoryName": "Rain", "enabled": true, "value": 0.5}
restoreState
Restaurar un estado guardado previamente desde un enlace de uso compartido creado por la aplicación.
{"command": "restoreState", "link": "slashpaf://..."}
setConfig
Pasar una configuración a la integración de MQTT (si está conectada). Útil para automatizaciones avanzadas.
{"command": "setConfig", "key": "someKey", "value": "someValue"}
Manejo de errores
Si un comando no se puede ejecutar (por ejemplo, no existe un nombre de categoría o falta un campo requerido), la respuesta contendrá "ok": false y un mensaje error que describe lo que salió mal.
{"ok": false, "error": "category not found"}
{"ok": false, "error": "section required"}
{"ok": false, "error": "invalid json"}
Seguridad
De forma predeterminada, la API Local se vincula a 127.0.0.1 (solo localhost) y no es accesible desde otros dispositivos en tu red.
Si habilitas Escuchar en LAN, la API se vuelve accesible desde otros dispositivos. En ese caso, se requiere una clave de API para todas las solicitudes que no sean de localhost. La clave se genera automáticamente y se muestra en Configuración → Control externo → API Local; pásala con cada solicitud utilizando uno de:
- Encabezado:
Authorization: Bearer <your-api-key> - Parámetro de consulta:
?apiKey=<your-api-key>
Ejemplos:
# Using the Authorization header
curl http://192.168.0.10:8329/api/state ^
-H "Authorization: Bearer your-api-key-here"
# Using the query parameter
curl "http://192.168.0.10:8329/api/state?apiKey=your-api-key-here"
# Sending a command from another device
curl -X POST http://192.168.0.10:8329/api/command ^
-H "Authorization: Bearer your-api-key-here" ^
-H "Content-Type: application/json" ^
-d "{\"command\":\"play\",\"section\":\"Music\",\"categoryName\":\"Battle\"}"
# WebSocket with API key
wscat -c "ws://192.168.0.10:8329/ws?apiKey=your-api-key-here"
Las solicitudes de localhost nunca requieren una clave, incluso cuando el modo LAN está activado.
Puedes regenerar la clave de API en cualquier momento desde Configuración → Control externo → API Local. Todos los clientes conectados previamente necesitarán la nueva clave.
Comportamiento en segundo plano en dispositivos móviles
Los sistemas operativos móviles pueden suspender el manejo de HTTP y WebSocket entrantes cuando Audio Forge se ejecuta en segundo plano o cuando el dispositivo está bloqueado, incluso cuando la reproducción de audio nativa continúa. La API Local no se detiene deliberadamente, pero no puede garantizar la disponibilidad en segundo plano en iOS o Android.
Para un control remoto estable durante una sesión, mantén Audio Forge en primer plano y mantén la pantalla encendida. Esto evita depender de la ejecución en segundo plano que los sistemas móviles pueden detener en cualquier momento.