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

# Stream run events

> Opens a server-sent event stream of one run's live events, the way `cliq run` shows
progress. Pass the run id (not the name) in the `run_id` query parameter.

From the CLI: `cliq run`.

No credential is needed from this machine. From another host, send `Authorization: Bearer` with a dispatch token CliqHub signed for this daemon or a `cliq_tok_…` personal token of a user in the daemon's realm; this only works once the daemon is connected to CliqHub. See [Authentication](/daemon-api/overview#authentication).



## OpenAPI

````yaml /openapi/daemon-by-tag/daemon-runs.yaml get /v1/runs/events
openapi: 3.1.0
info:
  title: cliqd API
  version: 1.9.48
  description: >-
    HTTP API of `cliqd`, the local Cliq daemon. Generated from the daemon source
    by `scripts/generate_daemon_openapi.mjs` — do not edit by hand. See the
    [overview](/daemon-api/overview).
servers:
  - url: http://127.0.0.1:4900
    description: Local daemon (default port; `CLIQ_DAEMON_PORT` changes it)
security: []
tags:
  - name: Daemon Runs
    description: >-
      Runs on this daemon. Start one with Start a run (Workspaces); everything
      after that is

      here: list runs, read a run's log, phases and tree of sub-runs, follow it
      live, supply

      the inputs a paused run is waiting for, and rerun a finished run from a
      phase.


      Wherever a body takes `run_id` you may also send the run's **name**,
      except the event

      endpoints, which need the id. Run ids are UUIDs.


      A run's life: `running` → (`awaiting_input` ↔ `running`)* → `completed`,
      `failed`,

      `cancelled` or `crashed`.
paths:
  /v1/runs/events:
    get:
      tags:
        - Daemon Runs
      summary: Stream run events
      description: >-
        Opens a server-sent event stream of one run's live events, the way `cliq
        run` shows

        progress. Pass the run id (not the name) in the `run_id` query
        parameter.


        From the CLI: `cliq run`.


        No credential is needed from this machine. From another host, send
        `Authorization: Bearer` with a dispatch token CliqHub signed for this
        daemon or a `cliq_tok_…` personal token of a user in the daemon's realm;
        this only works once the daemon is connected to CliqHub. See
        [Authentication](/daemon-api/overview#authentication).
      operationId: daemon_get_runs_events
      parameters:
        - name: run_id
          in: query
          required: true
          description: Run id
          schema:
            type: string
            minLength: 1
            description: Run id
      responses:
        '200':
          description: A `text/event-stream` that ends with `run_end`.
          content:
            text/event-stream:
              schema:
                $ref: '#/components/schemas/RunEventStream'
              example: >
                event: connected

                data:
                {"run_id":"0c8d7e6f-5a4b-4c3d-9e2f-1a0b9c8d7e6f","state":"running"}


                event: phase.started

                data:
                {"id":1840,"event_type":"phase.started","phase":"review","agent":"claude-code","payload":null,"created_at":1759834210000}


                event: phase.completed

                data:
                {"id":1842,"event_type":"phase.completed","phase":"review","agent":"claude-code","payload":{"message":"3
                findings"},"created_at":1759834480000}


                event: run_end

                data:
                {"run_id":"0c8d7e6f-5a4b-4c3d-9e2f-1a0b9c8d7e6f","state":"completed","error":null}
        '400':
          description: >-
            `PAYLOAD_INVALID` — The body (query string for `GET`) fails the
            request schema. `details` lists each issue.


            `BAD_REQUEST` — The body is not valid JSON or is larger than the
            route allows (10 MB; artifact uploads more).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                PAYLOAD_INVALID:
                  summary: PAYLOAD_INVALID
                  value:
                    ok: false
                    error:
                      code: PAYLOAD_INVALID
                      message: >-
                        run_id: Invalid input: expected string, received
                        undefined
                      details:
                        - path: run_id
                          message: 'Invalid input: expected string, received undefined'
                BAD_REQUEST:
                  summary: BAD_REQUEST
                  value:
                    ok: false
                    error:
                      code: BAD_REQUEST
                      message: >-
                        Request body could not be read: Unexpected token } in
                        JSON at position 12
        '401':
          description: >-
            `UNAUTHORIZED` — A caller on another host sent no `Authorization:
            Bearer` token, or one that does not verify (expired, wrong
            audience).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                UNAUTHORIZED:
                  summary: UNAUTHORIZED
                  value:
                    ok: false
                    error:
                      code: UNAUTHORIZED
                      message: Missing or invalid Authorization Bearer token
        '403':
          description: >-
            `WEB_REQUEST_REFUSED` — The request carries an `Origin` header (it
            came from a web page).


            `HOST_NOT_LOCAL` — A loopback caller addressed a `Host` other than
            localhost (DNS rebinding guard).


            `LOCAL_ONLY` — The daemon isn't connected to CliqHub (no dispatch
            key) and the caller is on another host.


            `FORBIDDEN` — A `cliq_tok_…` token's user is not in this daemon's
            realm ACL, or the ACL is not loaded yet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                WEB_REQUEST_REFUSED:
                  summary: WEB_REQUEST_REFUSED
                  value:
                    ok: false
                    error:
                      code: WEB_REQUEST_REFUSED
                      message: cliqd doesn't accept requests from web pages
                HOST_NOT_LOCAL:
                  summary: HOST_NOT_LOCAL
                  value:
                    ok: false
                    error:
                      code: HOST_NOT_LOCAL
                      message: cliqd only answers requests addressed to localhost
                LOCAL_ONLY:
                  summary: LOCAL_ONLY
                  value:
                    ok: false
                    error:
                      code: LOCAL_ONLY
                      message: >-
                        This cliqd isn't connected to CliqHub yet, so from
                        another machine it only accepts a local token (minted by
                        tokens/create on the machine running cliqd)
                FORBIDDEN:
                  summary: FORBIDDEN
                  value:
                    ok: false
                    error:
                      code: FORBIDDEN
                      message: Access denied — identity not in realm ACL
        '404':
          description: >-
            `RUN_NOT_FOUND` — No run has this id (a run name is not accepted
            here). Sent before the stream opens.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                RUN_NOT_FOUND:
                  summary: RUN_NOT_FOUND
                  value:
                    ok: false
                    error:
                      code: RUN_NOT_FOUND
                      message: Run 'fix-login-timeout' not found
        '500':
          description: >-
            `INTERNAL_ERROR` — An unexpected daemon fault. The message names the
            request id; the cause is in the cliqd log.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorReply'
              examples:
                INTERNAL_ERROR:
                  summary: INTERNAL_ERROR
                  value:
                    ok: false
                    error:
                      code: INTERNAL_ERROR
                      message: >-
                        cliqd hit an unexpected error (request 7f3a…). Details
                        are in the cliqd log.
      security:
        - {}
        - DaemonBearer: []
components:
  schemas:
    RunEventStream:
      type: string
      description: >
        A `text/event-stream`. Each message is `event: <type>` and `data:
        <JSON>`:


        - `connected` — first, with `{ run_id, state }`.

        - one message per run event as it happens, named by its type
        (`phase.started`,
          `phase.completed`, `phase.input_required`, `run.completed`, …), with
          `{ id, event_type, phase, agent, payload, created_at }`.
        - `run_end` — last, with `{ run_id, state, error }`; then the stream
        closes.


        Events are not replayed: you see what happens after you connect. A run
        that has

        already finished gets `connected` and `run_end` at once. Read history
        with Read a run log.
    ErrorReply:
      type: object
      description: >-
        Every failure. Switch on `error.code` — it is stable; `message` is for
        people and may change.
      required:
        - ok
        - error
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Stable error code. See [Errors](/daemon-api/errors).
              example: TEAM_NOT_FOUND
            message:
              type: string
              description: What went wrong and, where possible, what to do.
              example: Team 'acme/code-review' not found
            details:
              description: >-
                Structured detail when there is some: the list of schema issues
                for `PAYLOAD_INVALID`, the agent problems for
                `TEAM_AGENT_CONFIG_REQUIRED`, …
  securitySchemes:
    DaemonBearer:
      type: http
      scheme: bearer
      description: >-
        Not needed from the same machine. From another host: a dispatch JWT
        CliqHub signed for this daemon, or a `cliq_tok_…` personal token whose
        user is in the daemon's realm.

````

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