> ## 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

> Emite un JWT corto de Supabase Realtime para que un canal se suscriba a broadcasts privados del storefront.

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 `customer_id`. Úsalo junto a la publishable key de la misma respuesta para unirte a los topics privados.

> [!NOTE]
>
> Requiere un access token de Fire spark obtenido con [intercambio de
> token](https://firespark.cloud/docs/es/storefront-api/oauth/exchange/post.md).

El body opcional acepta los mismos campos de scope que [Obtener menús](https://firespark.cloud/docs/es/storefront-api/menus/get.md). El topic de workspace es `sf:{merchant}:{env}` (menús y disponibilidad). Los cambios de pedido van al topic del cliente `sf:{merchant}:{env}:c:{customer_id}`. El cliente debe ignorar eventos cuyo scope no solape el menú actual.

## Request

```bash theme={null}
curl -X POST "https://firespark.cloud/api/storefront/v1/realtime/token" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"store_id":"downtown","channel_id":"kiosk","fulfillment_id":"dine-in"}'
```

## Response

| Campo | Descripción |
| - | - |
| `access_token` | JWT de corta duración para `setAuth` en el cliente Realtime. Expira en 300 segundos. |
| `expires_in` | Siempre `300`. Renueva antes de que expire. |
| `url` | URL del proyecto de Supabase. |
| `key` | Publishable key. Se puede incrustar; RLS y el token corto limitan el acceso. |
| `topic` | Nombre del canal privado de este workspace. |
| `customer_topic` | Canal privado de eventos de pedido de este cliente (`…:c:{customer_id}`). |

## Eventos

| Evento | Cuándo |
| - | - |
| `menu.changed` | Un sync de menú terminó como latest y reemplazó filas live. El payload es el scope publicado (`fulfillment_id`, `store_id`, `channel_id`, `brand_id`). |
| `availability.changed` | Se guardaron reglas de disponibilidad. Payload `{ merchant_id }`. Pensado para kiosco. |
| `payments.changed` | Se creó, editó o eliminó un método de pago. Payload `{ merchant_id }`. Pensado para kiosco. |
| `fulfillments.changed` | Se creó, editó o eliminó un fulfillment. Payload `{ merchant_id }`. Pensado para kiosco. |
| `order.changed` | El fulfillment del pedido avanzó, pausó, falló o llegó a terminal. Sale cuando cada nodo termina su trabajo (callbacks incluidas), no al entrar. Incluye `checkout_state`, `run_status`, `callbacks[]` (con `response` / `errors`) y `error`. Suscríbete con `realtime.listenOrder({ orderId })` en `customer_topic`. En cada `SUBSCRIBED` el SDK pide [Obtener fulfillment del pedido](https://firespark.cloud/docs/es/storefront-api/orders/\[id]/fulfillment/get) y entrega ese snapshot por el mismo `on.changed`. Ver [Workflows de fulfillment](https://firespark.cloud/docs/es/guides/fulfillment-workflows.md). |


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