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í.
Límites
Sección titulada «Límites»API del overlay
El panel genera un enlace firmado (overlayToken, scope overlay:read, válido 30 días) y sincroniza el estado entre el dashboard y OBS.
Generar enlace
POST
https://ttv.losperris.dev/api/dashboard/overlay-link| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
tool | String | Sí | 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
GET
https://ttv.losperris.dev/api/dashboard/overlay-state/rouletteLee 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"
}
}PUT
https://ttv.losperris.dev/api/dashboard/overlay-state/roulette| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
state | Object | Sí | 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"
}
}Configuración en OBS
Sección titulada «Configuración en OBS»- Copia la URL del overlay desde el panel.
- Añádela como fuente Navegador en OBS (fondo transparente).
- Añade participantes manualmente, por importación o con Activos del chat.
- Pulsa Girar en el panel para lanzar la animación en OBS.
Características
Sección titulada «Características»- 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.