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

# Subscribe to stream

> Suscríbete al stream de un chat activo para recibir las respuestas de la IA en tiempo real

Suscríbete al stream de un chat activo para recibir las respuestas de la IA en tiempo real. Es una alternativa a consultar el endpoint [Get Status](/docs/es/api/get-status).

## Solicitud

```
GET /api/chat/{chatId}/subscribe
```

### Encabezados

| Encabezado | Obligatorio | Descripción |
| - | - | - |
| `Authorization` | Sí | `Bearer macaly_...` |

### Parámetros de ruta

| Parámetro | Tipo | Descripción |
| - | - | - |
| `chatId` | string | El ID del chat devuelto por `POST /api/chat` |

### Solicitud de ejemplo

<CodeGroup>
  ```bash cURL theme={null}
  curl -N https://www.macaly.com/api/chat/abc123/subscribe \
    -H "Authorization: Bearer macaly_abc123..."
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    `https://www.macaly.com/api/chat/${chatId}/subscribe`,
    {
      headers: {
        'Authorization': 'Bearer macaly_abc123...',
      },
    }
  );

  if (response.status === 204) {
    console.log('No active stream');
    return;
  }

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    const chunk = decoder.decode(value);
    for (const line of chunk.split('\n')) {
      if (line.startsWith('0:')) {
        // Text content
        const text = JSON.parse(line.slice(2));
        process.stdout.write(text);
      }
    }
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      f'https://www.macaly.com/api/chat/{chat_id}/subscribe',
      headers={
          'Authorization': 'Bearer macaly_abc123...',
      },
      stream=True,
  )

  if response.status_code == 204:
      print('No active stream')
  else:
      for line in response.iter_lines():
          if line:
              line = line.decode('utf-8')
              if line.startswith('0:'):
                  import json
                  text = json.loads(line[2:])
                  print(text, end='')
  ```
</CodeGroup>

## Respuesta

Devuelve un stream de eventos enviados por el servidor (SSE) con el progreso del proceso y las respuestas de la IA.

### Formato del stream

El stream usa el protocolo de stream de datos del [Vercel AI SDK v4](https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol#data-stream-protocol). Cada fragmento lleva un prefijo que indica el tipo:

| Prefijo | Descripción |
| - | - |
| `0:` | Contenido de texto |
| `2:` | Objetos de datos (como `{ chatId }`) |
| `8:` | Anotaciones y metadatos |

### Ejemplo de stream

```
2:[{"chatId":"abc123"}]
0:"I'll create a landing page for you."
0:" Let me start by setting up the project structure."
8:{"type":"tool-call","toolName":"WriteFile",...}
0:" Done! Your landing page is ready."
```

## Códigos de estado

| Código | Descripción |
| - | - |
| 200 | Correcto (respuesta en streaming) |
| 204 | Sin stream activo (el proceso ha finalizado o no se ha iniciado) |
| 401 | Clave API no válida o ausente |
| 403 | El chat no pertenece a tu equipo |
| 404 | Chat no encontrado |
| 429 | Límite de solicitudes alcanzado |

## Notas

* El stream terminará cuando el proceso finalice
* Si llamas a este endpoint después de que el proceso haya finalizado, obtendrás una respuesta `204 No Content`
* Para implementaciones más sencillas, considera consultar en su lugar el endpoint [Get Status](/docs/es/api/get-status)


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