> ## Documentation Index
> Fetch the complete documentation index at: https://firespark.cloud/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Emitir token realtime de kiosco

> Emite un JWT corto para que una tablet vinculada se suscriba a comandos del dispositivo y a eventos de menú.

Emite un JWT de 5 minutos firmado con el JWT secret del proyecto. El token usa `role: anon` con claims de workspace (`merchant_id`, `env`) más `device_uid`. Úsalo junto a la publishable key de la misma respuesta para unirte al topic del dispositivo y al topic del workspace.

> [!NOTE]
>
> Autentica con `device_uid` y `device_secret` en el body JSON. No es el [token
> realtime de cliente](https://firespark.cloud/docs/es/storefront-api/realtime/token/post.md).

Renueva antes de `expires_in`. El helper del SDK `listenKiosk` refresca cada 270 segundos.

## Request body

| Campo | Requerido | Tipo | Descripción |
| - | - | - | - |
| `device_uid` | Sí | string | UUID de la respuesta de link. |
| `device_secret` | Sí | string | Secreto ya fijado. |

## Request

```bash theme={null}
curl -X POST "https://firespark.cloud/api/storefront/v1/kiosk/realtime/token" \
  -H "Content-Type: application/json" \
  -d '{"device_uid":"7c8a1e2b-4d3f-4a91-9c2e-1f0b6a7d8e90","device_secret":"ksec_9f86d081884c7d659a2feaa0c55ad015"}'
```

## Response

El body es `{ data: KioskRealtimeToken }`.

| Campo | Descripción |
| - | - |
| `access_token` | JWT corto para `setAuth` en el cliente Realtime. Expira en 300 segundos. |
| `expires_in` | Siempre `300`. |
| `url` | URL del proyecto de Supabase. |
| `key` | Publishable key. Se puede incrustar; RLS y el token corto limitan el acceso. |
| `topic` | Canal del dispositivo `sf:{merchant}:{env}:k:{device_uid}`. |
| `workspace_topic` | Canal del workspace `sf:{merchant}:{env}` para menú y disponibilidad. |

## Eventos

Suscríbete a `topic` para eventos del dispositivo. Suscríbete a `workspace_topic` para el catálogo (mismos payloads que el [token realtime de cliente](https://firespark.cloud/docs/es/storefront-api/realtime/token/post.md)). Por cada bloque CMS que muestra la tablet, suscríbete a `{workspace_topic}:cms:{block_name}`. Solo los dispositivos unidos al topic de ese bloque reciben sus cambios.

| Evento | Topic | Cuándo |
| - | - | - |
| `kiosk.config.changed` | `topic` | El panel guardó overrides o ajustes que afectan este dispositivo. Payload `{ device_uid }`. |
| `kiosk.command` | `topic` | Comando remoto: `refresh_cache`, `reload` o `unlink`. Payload `{ type, device_uid? }`. |
| `menu.changed` | `workspace_topic` | Un sync de menú terminó como latest. Ignora eventos cuyo scope no solape esta tablet. |
| `availability.changed` | `workspace_topic` | Se guardaron reglas de disponibilidad. Payload `{ merchant_id }`. |
| `payments.changed` | `workspace_topic` | Se creó, editó o eliminó un método de pago. Payload `{ merchant_id }`. Vuelve a pedir pagos. |
| `fulfillments.changed` | `workspace_topic` | Se creó, editó o eliminó un fulfillment. Payload `{ merchant_id }`. Vuelve a pedir fulfillments. |
| `cms.changed` | `{workspace_topic}:cms:{block_name}` | Ese bloque CMS se creó, editó, renombró o eliminó. Payload `{ name }`. Vuelve a pedir el bloque. |

## Errores

| Status | Cuándo |
| - | - |
| `404` | El dispositivo no existe o no está `LINKED`/`ENROLLED`. `code: "DEVICE_NOT_LINKED"`. |
| `401` | El secreto aún no está fijado, o no coincide. |
| `400` | El body no pasó validación. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.