Ir al contenido

Ruleta

Herramienta de sorteos con overlay para OBS. Los participantes se gestionan desde el panel y el resultado se muestra en stream.

Solo dashboard
AutenticaciónRequiere sesión OAuth del panel (cookie HttpOnly). No uses la API Key de bot en el navegador del overlay.

Abre Ruleta en el panel, genera la URL del overlay y controla el sorteo desde ahí.

API del overlay

El panel genera un enlace firmado (overlayToken, scope overlay:read, válido 7 días) y sincroniza el estado entre el dashboard y OBS.

Generar enlace

POSThttps://ttv.losperris.dev/api/dashboard/overlay-link
ParámetroTipoRequeridoDescripción
toolStringSíroulette
curl --request POST \

  --url 'https://ttv.losperris.dev/api/dashboard/overlay-link' \

  --header 'Content-Type: application/json' \

  --cookie 'tu_sesion_dashboard' \

  --data '{"tool":"roulette"}'
	{​"url": "https://ttv.losperris.dev/overlay/roulette?overlayToken=eyJ..."​}
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: public, s-maxage=10, stale-while-revalidate
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{

  "url": "https://ttv.losperris.dev/overlay/roulette?overlayToken=eyJ..."

}
	{​"success": false,​"error": {​"message": "Usuario no encontrado",​"code": "UNAUTHORIZED"​}​}
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{

  "success": false,

  "error": {

    "message": "Usuario no encontrado",

    "code": "UNAUTHORIZED"

  }

}

Estado compartido

GEThttps://ttv.losperris.dev/api/dashboard/overlay-state/roulette

Lee el estado publicado por el panel. El overlay en OBS usa el token de la URL; el panel usa la sesión del dashboard.

	{"state": {"chatters": [{ "user_login": "viewer1", "user_name": "Viewer1" }],"isOpen": true,"isSpinning": false,"wheelRotation": 0,"wheelTransition": "none","winner": null,"lastSpinCount": 0,"spinSeq": 0,"updatedAt": 1752012234567}}
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: public, s-maxage=10, stale-while-revalidate
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{
  "state": {
    "chatters": [{ "user_login": "viewer1", "user_name": "Viewer1" }],
    "isOpen": true,
    "isSpinning": false,
    "wheelRotation": 0,
    "wheelTransition": "none",
    "winner": null,
    "lastSpinCount": 0,
    "spinSeq": 0,
    "updatedAt": 1752012234567
  }
}
	{ "state": null }
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: public, s-maxage=10, stale-while-revalidate
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{ "state": null }
	{​"success": false,​"error": {​"message": "Usuario no encontrado",​"code": "UNAUTHORIZED"​}​}
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{

  "success": false,

  "error": {

    "message": "Usuario no encontrado",

    "code": "UNAUTHORIZED"

  }

}
PUThttps://ttv.losperris.dev/api/dashboard/overlay-state/roulette
ParámetroTipoRequeridoDescripción
stateObjectSíJSON con el estado de la herramienta (máx. 64 KB, máx. 200 claves).
	{ "success": true }
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: public, s-maxage=10, stale-while-revalidate
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{ "success": true }
	{​"success": false,​"error": {​"message": "Solo el panel puede publicar el estado del overlay.",​"code": "FORBIDDEN"​}​}
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710000060

{

  "success": false,

  "error": {

    "message": "Solo el panel puede publicar el estado del overlay.",

    "code": "FORBIDDEN"

  }

}
  1. En el panel, pulsa Overlay, elige color / tamaño si quieres y copia la URL.
  2. Añádela como fuente Navegador en OBS con el ancho × alto del modal (base Normal: 720 × 720 px) y fondo transparente.
  3. Marca Actualizar navegador cuando la escena se active (o Apagar fuente cuando no sea visible si se congela al cambiar de escena).
  4. Añade participantes manualmente, por importación o con Activos del chat.
  5. Pulsa Girar en el panel para lanzar la animación en OBS.
  • Dos modos de entrada: quien chatea (y chatters activos) o keyword configurable (p. ej. !sorteo).
  • Filtros por rol (subs, mods, VIPs, viewers).
  • Re-sortear sin el ganador actual.
  • Historial local de ganadores recientes.
  • Animación con aceleración y frenado progresivo; overlay OBS sincronizado.