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

# Get the operational dashboard snapshot

> Returns one consistent read of the tenant's hub: a point-in-time subscription census and push backlog, plus ingestion, push-delivery, and pull-eligibility counts over the selected period, with a time series. The period is `[from, to)`, or the rolling `window_hours` width that ends at the hub's snapshot instant. A count is `0` when nothing matched; `null` means the fact does not exist. This route never consumes events and never moves a pull cursor. Authorization checks the resource `dashboard` and the action `get`.



## OpenAPI

````yaml /pt/openapi/v3-current/streaming-hub.yaml get /v1/dashboard
openapi: 3.1.0
info:
  title: Lerian Streaming Hub API
  version: 1.2.0
  contact:
    email: contact@lerian.studio
    name: Lerian Studio
    url: https://lerian.studio
  license:
    name: Lerian Studio General License
  description: >-
    The Streaming Hub control-plane API. Streaming Hub is Lerian's managed
    event-delivery edge: it consumes CloudEvents from the platform's internal
    streaming backbone and fans them out to a tenant's own external destinations
    — webhooks, Amazon SQS, RabbitMQ, Amazon EventBridge, or a pull inbox. This
    API lets a tenant browse the manifest-fed event catalog, create and manage
    delivery subscriptions, verify and rotate their credentials, read delivery
    health, and pull entitled events.


    An RFC 9457 `application/problem+json` error body carries `type`, `title`,
    and `status`. An error the hub raises adds `detail` and a stable
    low-cardinality `code` you can branch on; a request the framework rejects
    before the operation runs, such as a malformed or schema-invalid one,
    carries no `code`. In a `5xx`, `detail` is the static `"internal error"`.
    Mutating operations require an `X-Idempotency` header for at-most-once
    semantics; a replayed request returns the original response byte-for-byte
    with `X-Idempotency-Replayed: true`. The catalog and the pull events surface
    are tenant-scoped through the bearer JWT; the operational probe endpoints
    (`/healthz`, `/readyz`, `/version`, `/runtime`, `/metrics`) are
    unauthenticated. Streaming Hub is closed source under the Lerian Studio
    General License.
servers:
  - url: https://streaming-hub.sandbox.lerian.net
security:
  - BearerAuth: []
tags:
  - name: Catalog
    description: Browse the manifest-fed catalog of event types available for subscription.
  - name: Subscriptions
    description: >-
      Create, read, update, and delete delivery subscriptions, and drive the
      destination verification lifecycle (ping, verify, credential, delegated
      grant, secret rotation, health).
  - name: Event Delivery
    description: >-
      Pull entitled events for a pull-sink subscription
      (cursor-as-acknowledgment read).
  - name: Dashboard
    description: >-
      The read-only operational dashboard: a consistent snapshot of ingestion,
      push delivery, and pull eligibility, plus the paged list of subscriptions
      that need attention. It never consumes events and never returns a secret.
  - name: Admin
    description: Cross-tenant operator forensics. Requires an operator authorization scope.
  - name: Operational
    description: Unauthenticated liveness, readiness, build, runtime, and metrics probes.
paths:
  /v1/dashboard:
    get:
      tags:
        - Dashboard
      summary: Get the operational dashboard snapshot
      description: >-
        Returns one consistent read of the tenant's hub: a point-in-time
        subscription census and push backlog, plus ingestion, push-delivery, and
        pull-eligibility counts over the selected period, with a time series.
        The period is `[from, to)`, or the rolling `window_hours` width that
        ends at the hub's snapshot instant. A count is `0` when nothing matched;
        `null` means the fact does not exist. This route never consumes events
        and never moves a pull cursor. Authorization checks the resource
        `dashboard` and the action `get`.
      operationId: getDashboard
      parameters:
        - name: from
          in: query
          required: false
          description: >-
            The inclusive start of the period, an RFC 3339 instant. Defaults to
            the resolved `to` minus 24 hours.
          schema:
            type: string
            format: date-time
        - name: to
          in: query
          required: false
          description: >-
            The exclusive end of the period, an RFC 3339 instant. Defaults to
            the snapshot instant; a later value is rejected. The period spans at
            most 30 days.
          schema:
            type: string
            format: date-time
        - name: window_hours
          in: query
          required: false
          description: >-
            A rolling period width in whole hours, from `1` to `720`: the window
            `[snapshot_at - window_hours, snapshot_at)` on the hub's clock. Use
            it for a preset period, such as the last 24 hours. It cannot be sent
            with `from` or `to`. To read the attention list over the same
            period, send this response's `window_start` and `window_end` to `GET
            /v1/dashboard/subscriptions` as `from` and `to`.
          schema:
            type: integer
      responses:
        '200':
          description: The dashboard snapshot.
          headers:
            Cache-Control:
              $ref: '#/components/headers/NoStore'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DashboardSnapshot'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          description: A query parameter is invalid. `code` is `validation_error`.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/RateLimiterUnavailable'
      security:
        - BearerAuth: []
components:
  headers:
    NoStore:
      description: Always `private, no-store`. Do not cache this response.
      schema:
        type: string
        enum:
          - private, no-store
    RateLimitLimit:
      description: >-
        The requests this tenant may make in one window of this route's
        allowance.
      schema:
        type: integer
        examples:
          - 60
    RateLimitRemaining:
      description: The requests left in the current window. `0` on a refusal.
      schema:
        type: integer
        examples:
          - 59
    RateLimitReset:
      description: The Unix time, in seconds, at which the current window ends.
      schema:
        type: integer
        examples:
          - 1789499562
    RetryAfter:
      description: The whole seconds to wait before a retry. Always at least `1`.
      schema:
        type: string
        examples:
          - '1'
  schemas:
    DashboardSnapshot:
      type: object
      additionalProperties: false
      properties:
        snapshot_at:
          type: string
          format: date-time
          description: >-
            The database instant the read observed (UTC, RFC 3339). Every
            `current_state` figure is true at this instant, and `window_end` is
            never after it.
          examples:
            - '2026-09-11T12:00:00Z'
        window_start:
          type: string
          format: date-time
          description: >-
            The inclusive start of the resolved period (UTC, RFC 3339). Every
            `selected_period` count is taken over `[window_start, window_end)`.
          examples:
            - '2026-09-10T12:00:00Z'
        window_end:
          type: string
          format: date-time
          description: >-
            The exclusive end of the resolved period (UTC, RFC 3339). It is
            `snapshot_at` when the request omits `to`.
          examples:
            - '2026-09-11T12:00:00Z'
        current_state:
          $ref: '#/components/schemas/DashboardCurrentState'
        selected_period:
          $ref: '#/components/schemas/DashboardSelectedPeriod'
      required:
        - snapshot_at
        - window_start
        - window_end
        - current_state
        - selected_period
    Error:
      type: object
      description: >-
        RFC 9457 `application/problem+json` document. An error the hub raises
        carries `detail` and the stable `code` a client branches on; a request
        the framework rejects before the operation runs carries no `code`. In a
        `5xx`, `detail` is the static `"internal error"`.
      properties:
        type:
          type: string
          format: uri
          description: >-
            A stable, versioned URI identifying the problem type
            (`https://errors.lerian.studio/v1/<code>`), or `about:blank` for
            problems without a hub-assigned code.
          examples:
            - https://errors.lerian.studio/v1/not_found
        title:
          type: string
          description: A short human-readable summary — the HTTP status text.
          examples:
            - Not Found
        status:
          type: integer
          description: The HTTP status code, mirrored in the body.
          examples:
            - 404
        detail:
          type: string
          description: >-
            A caller-safe human explanation of this specific occurrence. For
            `5xx` responses this is always the static string `"internal error"`.
          examples:
            - subscription not found
        code:
          type: string
          description: >-
            The stable, low-cardinality, machine-readable token a client
            branches on (for example `not_found`, `unauthorized`,
            `idempotency_conflict`, `validation_error`). Absent when the
            framework rejects the request before the operation runs.
          examples:
            - not_found
      required:
        - type
        - title
        - status
    DashboardCurrentState:
      type: object
      additionalProperties: false
      description: >-
        What the tenant's hub looks like at `snapshot_at`, independent of the
        period.
      properties:
        subscriptions:
          $ref: '#/components/schemas/DashboardSubscriptionCensus'
        push:
          $ref: '#/components/schemas/DashboardCurrentPush'
      required:
        - subscriptions
        - push
    DashboardSelectedPeriod:
      type: object
      additionalProperties: false
      description: >-
        The counts over `[window_start, window_end)`. Every count is `0` when
        none, never `null`.
      properties:
        events_received:
          type: integer
          description: >-
            The events the hub received in the period. Not a delivery count: a
            received event can match no subscription.
          examples:
            - 1280
        push:
          $ref: '#/components/schemas/DashboardPushPeriod'
        pull:
          $ref: '#/components/schemas/DashboardPullPeriod'
        pull_omitted_reason:
          type:
            - string
            - 'null'
          description: >-
            Why `pull` was not computed. `null` exactly when `pull` is present.
            The only value is `window_exceeds_pull_ceiling`.
          examples:
            - window_exceeds_pull_ceiling
        pull_window_ceiling_hours:
          type: integer
          description: >-
            The widest period, in whole hours, for which the hub computes
            `pull`. A period of exactly this width still carries `pull`.
          examples:
            - 48
        time_series:
          type: array
          description: >-
            Contiguous ascending buckets that tile the period with no gap or
            overlap: hourly (UTC) for a period up to 48 hours, daily (UTC) above
            it. The bucket counts sum to the period counts, except
            `pull.eligible_events`, which is a distinct count taken separately
            in each bucket and can sum higher. An empty series is `[]`.
          items:
            $ref: '#/components/schemas/DashboardTimeBucket'
      required:
        - events_received
        - push
        - pull
        - pull_omitted_reason
        - pull_window_ceiling_hours
        - time_series
    RateLimiterUnavailableError:
      type: object
      description: The flat error body of a `503` from the rate limiter.
      properties:
        code:
          type: integer
          description: The HTTP status, repeated in the body.
          examples:
            - 503
        title:
          type: string
          description: A stable machine-readable identifier.
          examples:
            - service_unavailable
        message:
          type: string
          description: A human-readable explanation.
          examples:
            - rate limiter temporarily unavailable
      required:
        - code
        - title
        - message
    DashboardSubscriptionCensus:
      type: object
      additionalProperties: false
      description: >-
        The subscription census at `snapshot_at`: a total and four independent
        splits of the same subscriptions. Each split sums to `total`. Every
        count is `0` when none, never `null`.
      properties:
        total:
          type: integer
          description: The subscriptions in scope.
          examples:
            - 12
        by_enabled:
          $ref: '#/components/schemas/DashboardEnabledCounts'
        by_verification_state:
          $ref: '#/components/schemas/DashboardVerificationStateCounts'
        by_sink_kind:
          $ref: '#/components/schemas/DashboardSinkKindCounts'
        by_channel:
          $ref: '#/components/schemas/DashboardChannelCounts'
      required:
        - total
        - by_enabled
        - by_verification_state
        - by_sink_kind
        - by_channel
    DashboardCurrentPush:
      type: object
      additionalProperties: false
      description: The push delivery backlog at `snapshot_at`.
      properties:
        pending_jobs:
          type: integer
          description: >-
            The delivery jobs still waiting for work (pending or retrying). `0`
            when none.
          examples:
            - 3
        oldest_pending_job_age_seconds:
          type:
            - integer
            - 'null'
          description: >-
            The age of the oldest pending job at `snapshot_at`, in whole
            seconds. `null` exactly when `pending_jobs` is `0`.
          examples:
            - 42
      required:
        - pending_jobs
        - oldest_pending_job_age_seconds
    DashboardPushPeriod:
      type: object
      additionalProperties: false
      description: The push side of a period or bucket.
      properties:
        delivery_jobs_created:
          type: integer
          description: >-
            The delivery jobs created in the period. A job created here can have
            no attempt here.
          examples:
            - 640
        delivery_attempts:
          $ref: '#/components/schemas/DashboardDeliveryAttemptCounts'
      required:
        - delivery_jobs_created
        - delivery_attempts
    DashboardPullPeriod:
      type:
        - object
        - 'null'
      additionalProperties: false
      description: >-
        Pull eligibility in the period, never delivery: a pull consumer
        acknowledges by moving its own cursor. It is computed from the pull
        subscriptions that exist now, so deleting or disabling one changes the
        counts of a closed period. `null` when the period exceeds
        `pull_window_ceiling_hours`.
      properties:
        eligible_events:
          type: integer
          description: >-
            The distinct events in the period that match at least one pull
            subscription.
          examples:
            - 420
        eligible_subscription_matches:
          type: integer
          description: >-
            The event and pull-subscription pairs in the period. At least
            `eligible_events` when an event matches more than one subscription.
          examples:
            - 440
      required:
        - eligible_events
        - eligible_subscription_matches
    DashboardTimeBucket:
      type: object
      additionalProperties: false
      properties:
        bucket_start:
          type: string
          format: date-time
          description: >-
            The inclusive bucket start (UTC), clipped to `window_start` on the
            first bucket.
          examples:
            - '2026-09-10T12:00:00Z'
        bucket_end:
          type: string
          format: date-time
          description: >-
            The exclusive bucket end (UTC), clipped to `window_end` on the last
            bucket.
          examples:
            - '2026-09-10T13:00:00Z'
        events_received:
          type: integer
          description: >-
            The events received in this bucket. A bucket with no events carries
            `0`.
          examples:
            - 53
        push:
          $ref: '#/components/schemas/DashboardPushPeriod'
        pull:
          $ref: '#/components/schemas/DashboardPullPeriod'
      required:
        - bucket_start
        - bucket_end
        - events_received
        - push
        - pull
    DashboardEnabledCounts:
      type: object
      additionalProperties: false
      description: The census split by the `enabled` flag.
      properties:
        enabled:
          type: integer
          examples:
            - 10
        disabled:
          type: integer
          examples:
            - 2
      required:
        - enabled
        - disabled
    DashboardVerificationStateCounts:
      type: object
      additionalProperties: false
      description: >-
        The census split by verification state. `disabled` is a reserved state
        that no operation sets.
      properties:
        pending_verification:
          type: integer
          examples:
            - 1
        active:
          type: integer
          examples:
            - 9
        degraded:
          type: integer
          examples:
            - 2
        disabled:
          type: integer
          examples:
            - 0
      required:
        - pending_verification
        - active
        - degraded
        - disabled
    DashboardSinkKindCounts:
      type: object
      additionalProperties: false
      description: The census split by sink kind.
      properties:
        webhook:
          type: integer
          examples:
            - 7
        sqs:
          type: integer
          examples:
            - 2
        rabbitmq:
          type: integer
          examples:
            - 1
        eventbridge:
          type: integer
          examples:
            - 1
        pull:
          type: integer
          examples:
            - 1
      required:
        - webhook
        - sqs
        - rabbitmq
        - eventbridge
        - pull
    DashboardChannelCounts:
      type: object
      additionalProperties: false
      description: >-
        The census split by delivery channel. `pull` counts the `pull` sink
        kind; `push` counts every other kind.
      properties:
        push:
          type: integer
          examples:
            - 11
        pull:
          type: integer
          examples:
            - 1
      required:
        - push
        - pull
    DashboardDeliveryAttemptCounts:
      type: object
      additionalProperties: false
      description: >-
        The delivery attempts made in the period, by outcome. Counts are per
        attempt, not per job.
      properties:
        delivered:
          type: integer
          examples:
            - 600
        failed:
          type: integer
          examples:
            - 30
        dead_lettered:
          type: integer
          examples:
            - 6
        disabled:
          type: integer
          examples:
            - 2
        available:
          type: integer
          examples:
            - 1
        poison:
          type: integer
          examples:
            - 1
      required:
        - delivered
        - failed
        - dead_lettered
        - disabled
        - available
        - poison
  responses:
    Unauthorized:
      description: >-
        Authentication failed, or there is no trusted tenant context. `code` is
        `unauthorized` (uniform body — no reason is leaked).
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >-
        Access Manager denied the request ahead of the hub, with a plain-text
        body. On the `/v1` surface the hub itself can also answer `403` as
        `application/problem+json` with `code` `forbidden`: the delegated scope
        the request presents disagrees with the scope claim on the relayed
        token.
      content:
        text/plain:
          schema:
            type: string
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: >-
        The tenant's allowance for this route is spent. `code` is
        `rate_limited`. Wait `Retry-After` seconds, then retry. Each tenant has
        three allowances: one for the catalog and the subscription list, detail,
        endpoint, health, and setup-artifacts reads; one for `GET /v1/events`;
        and one for the two dashboard routes.
      headers:
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
        X-RateLimit-Limit:
          $ref: '#/components/headers/RateLimitLimit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/RateLimitRemaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/RateLimitReset'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalError:
      description: >-
        An infrastructure fault. `code` is `internal_error` and `detail` is
        scrubbed to the static `"internal error"` (the cause is logged, never
        returned).
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimiterUnavailable:
      description: >-
        The hub could not check the tenant's allowance because its rate-limit
        store is unreachable, and this deployment is set to refuse rather than
        to serve unmetered requests. This is a transient condition, not a quota:
        retry with backoff. A deployment set to fail open serves the request
        instead. The body is a flat JSON object, not a problem document.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimiterUnavailableError'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        A bearer JWT issued by Access Manager. The `/v1` surface never reads a
        tenant from the body, path, or query. Machine callers obtain a token
        with the Access Manager client-credentials flow. The `/admin` surface
        authorizes against an operator scope and carries no tenant context.

````