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

# List bounded durable workflow signal history



## OpenAPI

````yaml /api/headgate.openapi.yaml get /workflows/{id}/signals
openapi: 3.1.0
info:
  title: headgate control API
  version: 0.1.0
  description: >
    The web UI is one client of this control API and gets no

    privileged access — asynqmon reads Redis directly, which is why its
    compatibility

    note is three minor versions stale.


    Both the Go and Rust implementations serve this spec, and the conformance
    suite

    asserts identical responses. Every list endpoint is bounded to prevent
    inspection

    from becoming an unbounded store operation: asynq's

    GetQueueInfo is O(number of groups) and has pinned Redis CPU for seconds in

    production. Monitoring caused the outage.


    DERIVED FROM THE ARCHITECTURE, NOT FROM A PREDECESSOR'S UI. The first draft
    of this

    spec was the asynq Inspector surface -- list by state, act on one job, pause
    a queue

    -- with new nouns bolted on. That inherited three problems: it omitted bulk

    operations, history, and enqueue (which asynq and apalis-board respectively
    DO have),

    and more importantly it had no endpoint for the question this system's own
    design

    creates. When dequeue is an admission decision, the operator's first
    question is not

    "what is in the queue" but "why is THIS job not running" -- see
    /jobs/{id}/admission.

    No predecessor needs that endpoint because no predecessor has a gate.
servers:
  - url: /api/v1
security: []
paths:
  /workflows/{id}/signals:
    get:
      summary: List bounded durable workflow signal history
      parameters:
        - $ref: '#/components/parameters/Id'
        - $ref: '#/components/parameters/ControlLimit'
        - name: cursor
          in: query
          schema:
            type: integer
            minimum: 1
      responses:
        '200':
          description: Newest-first signal emissions, at most 100 retained per workflow.
          content:
            application/json:
              schema:
                type: object
                required:
                  - signals
                  - next_cursor
                properties:
                  signals:
                    type: array
                    maxItems: 100
                    items:
                      $ref: '#/components/schemas/WorkflowSignal'
                  next_cursor:
                    type:
                      - integer
                      - 'null'
components:
  parameters:
    Id:
      name: id
      in: path
      required: true
      schema:
        type: string
    ControlLimit:
      name: limit
      in: query
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 200
  schemas:
    WorkflowSignal:
      type: object
      required:
        - id
        - signal
        - idempotency_key
        - payload
        - source
        - recorded_at_ms
      properties:
        id:
          type: integer
          minimum: 1
        signal:
          type: string
        idempotency_key:
          type: string
        payload:
          description: Arbitrary JSON value supplied by the emitter
          limited to 64 KiB after canonical serialization.: null
        source:
          description: Caller-supplied JSON describing the emitter or calling system
          limited to 16 KiB; it is not proof of identity by itself.: null
        recorded_at_ms:
          type: integer
          description: Timestamp assigned by the backing store.

````