API local
Ejecuta comandos, dispara eventos y sigue tu directo desde tus propios scripts, a través de HTTP o WebSocket
Tu script
POST /api/trigger
Host: 127.0.0.1:21424
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"name": "hype",
"data": {
"name": "mochi"
}
}{"ok":true}Eventos
Disparador de API
hype
POST /api/trigger ejecuta cada asignación cuyo disparador de API tenga ese nombre.
Controla Vfinity desde un script, un plugin de stream deck o una aplicación propia en el mismo equipo. Envía mensajes JSON para ejecutar cualquier comando nativo o activar tus eventos, y escucha mediante WebSocket los regalos, mensajes de chat y resultados en tiempo real.
La API local comparte el mismo servidor que tus overlays de OBS, en el puerto de overlay. Responde únicamente a programas ejecutados en este mismo ordenador y solo cuando aportan tu token de acceso.
Versión alfa
Vfinity 2.0 es una compilación alfa y sus funciones pueden cambiar entre actualizaciones. Vuelve a probar tu integración tras cada nueva versión antes de salir en directo.
Activar la API local
Abrir la tarjeta Servidor local
Ve a AjustesConexiones y baja hasta Avanzado. Abre la tarjeta Servidor local. Su línea de estado indicará Escuchando en http://127.0.0.1:21424 cuando el servidor esté activo.
Activar el servicio
Activa Activar API local. Vfinity generará un Token de acceso a la API automáticamente la primera vez.
Copiar el token y las direcciones
Haz clic en Copiar bajo el token y pégalo en tu script. La tarjeta también especifica las dos direcciones a utilizar (la URL de estado y la URL de WebSocket); haz clic en cualquiera de ellas para copiarla.
El botón Generar token sustituye el token actual. Cualquier script que continúe utilizando el token anterior quedará desconectado al instante, mientras que los overlays y tus conexiones en directo seguirán funcionando sin alteración. También puedes escribir tu propio token personalizado: entre 32 y 256 letras, dígitos, guiones o guiones bajos.
El puerto se configura en la misma tarjeta en Puerto del servidor compartido. Un cambio de puerto surte efecto tras reiniciar Vfinity. Si el puerto está ocupado al arrancar, Vfinity elegirá otro libre y la tarjeta mostrará la dirección real en uso.
Este PC
Vfinity se conecta a la API de VTube Studio en el puerto 8001 para pulsar atajos y mover tu modelo.
Vfinity se conecta al servidor WebSocket integrado en OBS, puerto 4455, para cambiar de escena y mostrar fuentes.
Una fuente de navegador de OBS abre el propio servidor de Vfinity, puerto 21424, para dibujar lanzamientos, alertas y widgets.
Tus scripts se comunican con la API local en ese mismo puerto, 21424, mediante un token.
TikTok LIVE, Twitch, Kick y YouTube se contactan a través de internet. Vfinity abre cada una de esas conexiones por sí mismo.
Flecha: quién inicia la conexión
Puerto: quién escucha la conexión
Comprobación de solicitudes
Cada petición HTTP y cada conexión por WebSocket requiere la siguiente cabecera:
Authorization: Bearer TU_TOKENUna solicitud se rechaza si proviene de otro equipo, si el token falta o es incorrecto, o si contiene una cabecera Origin de navegador web. Esta última regla impide que una página web llame a la API, incluso si se abre en este mismo equipo. Utiliza scripts locales o herramientas de escritorio con capacidad de definir cabeceras.
Activar el acceso de overlay para OBS en otro PC no expone la API a la red local, y la clave de acceso de overlay no es un token de API.
Vfinity debe estar en ejecución para responder peticiones. Permanecer oculto en la bandeja del sistema cuenta como ejecución activa; si cierras la app, nada estará escuchando.
Enviar peticiones por HTTP
| Petición | Cuerpo | Respuesta |
|---|---|---|
GET /api/state | ninguno | Los comandos disponibles, tus eventos, cifras del directo y la conexión con TikTok |
POST /api/trigger | {"name":"…","data":{…}} | {"ok":true} en cuanto se acepta el disparador |
POST /api/command | {"name":"…","args":…} | {"ok":true,"result":…} o bien {"ok":false,"error":"…"} |
Envía siempre la cabecera Content-Type: application/json con cada petición POST. El cuerpo puede ocupar hasta 64 KiB.
# ¿Qué puedo ejecutar?
curl -H "Authorization: Bearer TU_TOKEN" http://127.0.0.1:21424/api/state
# Añadir 30 segundos al temporizador del subathon
curl -X POST http://127.0.0.1:21424/api/command \
-H "Authorization: Bearer TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"timer.add","args":30}'$headers = @{ Authorization = "Bearer TU_TOKEN" }
# ¿Qué puedo ejecutar?
Invoke-RestMethod -Uri http://127.0.0.1:21424/api/state -Headers $headers
# Añadir 30 segundos al temporizador del subathon
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:21424/api/command `
-Headers $headers -ContentType "application/json" `
-Body '{"name":"timer.add","args":30}'Activar uno de tus eventos
Configura un evento con el disparador Disparador de la API y asígnale un Nombre del disparador, luego envía ese nombre mediante POST a /api/trigger. La coincidencia de nombre no distingue entre mayúsculas y minúsculas.
curl -X POST http://127.0.0.1:21424/api/trigger \
-H "Authorization: Bearer TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"alarma_raid","data":{"message":"Llega una raid","level":3}}'Cada campo dentro de data se convierte en una variable de plantilla accesible por los pasos del evento; por ejemplo, un paso de voz con {message} pronunciará "Llega una raid". Se admiten cadenas de texto, números y valores booleanos; los objetos y listas anidados no se procesan. El nombre de un campo debe comenzar por una letra, y se tienen en cuenta los primeros 50 campos.
La respuesta {"ok":true} confirma que Vfinity aceptó el disparador. Un evento desactivado, en pausa o retenido por su tiempo de espera no ejecutará acciones; escucha el evento actionResult en el WebSocket si necesitas verificar qué pasos se ejecutaron realmente.
Ejecutar un comando
Los comandos son las mismas acciones con nombre empleadas por los atajos globales, los botones del Panel rápido y los pasos de acción de comando. GET /api/state enumera los comandos ofrecidos en ese momento exacto, dado que algunos solo existen mientras su módulo correspondiente está activo.
{ "name": "control.panic" }
{ "name": "deck.press", "args": "Aplausos" }
{ "name": "giveaway.draw" }
{ "name": "sceneCard.showBrb" }
{ "name": "mapping.trigger", "args": "TU_ID_DE_EVENTO" }mapping.trigger ejecuta uno de tus eventos como si su disparador se hubiera activado externamente, respondiendo con cuántas ejecuciones inició. Acepta el ID del evento o el nombre de su disparador de API. Para obtener el ID, haz clic derecho sobre el evento en la pestaña Eventos y elige Copiar ID del evento.
Todos los comandos se detallan junto a sus argumentos en Comandos.
Conectar TikTok LIVE desde un script
| Comando | Argumentos | Qué hace |
|---|---|---|
tiktok.connect | opcional {"username","autoRejoin","waitForLive"} | Conecta con tus ajustes guardados, sobrescritos solo para esta sesión |
tiktok.disconnect | ninguno | Abandona el LIVE y detiene los reintentos de conexión |
tiktok.cancelRejoin | ninguno | Detiene la espera o el reintento, manteniendo conectado el LIVE si ya estaba dentro |
{
"name": "tiktok.connect",
"args": { "username": "tu_usuario", "autoRejoin": true, "waitForLive": true }
}La respuesta {"ok":true,"result":{"accepted":true}} significa que la solicitud se encoló, no que ya se haya entrado a la sala LIVE. Consulta el bloque tiktok de /api/state, o el evento tiktokStatus en el WebSocket: room.state indicará "connected" en cuanto Vfinity esté dentro de la emisión.
Escuchar mediante WebSocket
Conéctate a ws://127.0.0.1:21424/api/ws incluyendo la misma cabecera Authorization. Puedes enviar las mismas peticiones que por HTTP (cada una con un requestId que tú elijas) y Vfinity te transmitirá en directo todo lo que suceda en tu directo.
// npm install ws
const WebSocket = require('ws');
const socket = new WebSocket('ws://127.0.0.1:21424/api/ws', {
headers: { Authorization: 'Bearer TU_TOKEN' },
});
socket.on('open', () => {
socket.send(JSON.stringify({ type: 'command', name: 'timer.add', args: 30, requestId: '1' }));
});
socket.on('message', (raw) => {
const message = JSON.parse(raw);
if (message.type === 'event' && message.event === 'gift') {
console.log(`${message.data.nickname} envió ${message.data.giftName}`);
}
if (message.type === 'response') console.log(message.requestId, message.data);
});Mensajes que envías
{ "type": "state", "requestId": "1" }
{ "type": "command", "name": "timer.add", "args": 30, "requestId": "2" }
{ "type": "trigger", "name": "alarma_raid", "data": {}, "requestId": "3" }Cada petición recibe su correspondiente respuesta: {"type":"response","requestId":"2","data":{"ok":true}}.
Mensajes que envía Vfinity
Propiedad
Tipo
Un regalo que forma parte de un combo (giftType 1) envía actualizaciones mientras dura la racha. Actúa sobre él únicamente cuando repeatEnd no sea false, tal como hace el motor interno de Vfinity. Las marcas de tiempo son milisegundos en formato Unix.
El flujo es exclusivamente en tiempo real: no hay retransmisión de eventos pasados, y un cliente que lea con demasiada lentitud puede perder mensajes.
Límites y códigos de error
| Código / Error | Causa |
|---|---|
| HTTP 401 | Falta el token, es incorrecto o la petición incluye una cabecera Origin |
| HTTP 403 | La petición proviene de otro ordenador |
| HTTP 503 | La opción Activar API local está desactivada |
| HTTP 413 | El cuerpo supera el límite de 64 KiB |
| HTTP 429 | Ya hay 16 clientes de WebSocket conectados |
"busy" | Ya hay 32 peticiones esperando respuesta simultáneamente |
"timeout" | Sin respuesta tras 10 segundos. Si un comando ya inició, continuará ejecutándose |
"unknownCommand" | No existe ningún comando disponible con ese nombre en este momento |
"failed" | El comando se ejecutó y falló; la propiedad message detalla el motivo |
"invalidName" | Falta la propiedad name, está vacía o supera los 200 caracteres |
Las copias de seguridad estándar no incluyen el token y se restauran con la API desactivada por seguridad. Marca Incluir contraseñas y tokens al crear la copia si deseas preservarlo.
Hacer que Vfinity se conecte a tu servidor
La tarjeta API de disparadores, también bajo Avanzado, invierte la dirección de la conexión: Vfinity se conecta como cliente al servidor WebSocket que tú ejecutes. Resulta idóneo para servidores preexistentes, como los de un videojuego o un bot.
Tu script se conecta a Vfinity en el puerto 21424 con un token. Puede ejecutar comandos, disparar eventos, leer el estado del sistema y recibir todos los eventos del directo.
Vfinity se conecta a tu propio servidor (por defecto en localhost y puerto 8080) sin token. Tu servidor envía disparadores y comandos, y puede solicitar la lista de eventos de API.
Activa API de disparadores, introduce el Host del WebSocket y el Puerto del WebSocket, y haz clic en Conectar API. Tu servidor podrá enviar mensajes como:
{ "type": "trigger", "name": "alarma_raid", "data": { "message": "Llega una raid" } }
{ "type": "command", "name": "timer.add", "args": 30, "requestId": "abc-1" }
{ "type": "request", "requestType": "event_list", "requestId": "abc-2" }Un comando con requestId recibe una respuesta del tipo {"type":"response","requestType":"command","requestId":"abc-1","data":{"name":"timer.add","ok":true}}. event_list responde con todos los eventos que poseen disparador de API, sus pasos y su estado de activación, mientras que stats devuelve los estados de conexión y recuentos de eventos.
Cualquier proceso con acceso a tu servidor podrá ejecutar estos comandos; mantén el servidor confinado en este equipo o implementa tu propia capa de autenticación previa.