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

# List the event catalog

> Returns the manifest-fed catalog snapshot — the last-known-good aggregation of the producer manifests Streaming Hub tracks. The catalog is global in v1 (byte-identical regardless of which tenant authenticates) and control-plane only; the data plane never consults it. An empty snapshot returns `200` with `events: []` (fail-closed to last-known-good — never an error on an empty catalog).



## OpenAPI

````yaml en/openapi/v3-current/streaming-hub.yaml get /v1/catalog
openapi: 3.1.0
info:
  title: Lerian Streaming Hub API
  version: v1.0.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.


    Errors follow RFC 9457 `application/problem+json`: every hub-owned error
    body carries `type`, `title`, `status`, `detail`, and a stable
    low-cardinality `code` you can branch on. For `5xx` responses the `detail`
    is scrubbed to a static `"internal error"` so no internal cause leaks.
    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: Admin
    description: Cross-tenant operator forensics. Requires an operator authorization scope.
  - name: Operational
    description: Unauthenticated liveness, readiness, build, runtime, and metrics probes.
paths:
  /v1/catalog:
    get:
      tags:
        - Catalog
      summary: List the event catalog
      description: >-
        Returns the manifest-fed catalog snapshot — the last-known-good
        aggregation of the producer manifests Streaming Hub tracks. The catalog
        is global in v1 (byte-identical regardless of which tenant
        authenticates) and control-plane only; the data plane never consults it.
        An empty snapshot returns `200` with `events: []` (fail-closed to
        last-known-good — never an error on an empty catalog).
      operationId: getCatalog
      responses:
        '200':
          description: The catalog snapshot.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CatalogResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - BearerAuth: []
components:
  schemas:
    CatalogResponse:
      type: object
      additionalProperties: false
      properties:
        events:
          type: array
          description: >-
            The catalog entries in deterministic (topic, schemaMajor, eventType)
            order. Empty when the snapshot is empty.
          items:
            $ref: '#/components/schemas/CatalogEvent'
        availableMajors:
          type: object
          additionalProperties:
            type: array
            items:
              type: integer
          description: >-
            Per topic, the set of distinct schema-major values present in the
            snapshot, each ascending. An empty object when the snapshot is
            empty.
          examples:
            - lerian.streaming.transaction.created:
                - 1
      required:
        - events
        - availableMajors
    CatalogEvent:
      type: object
      additionalProperties: false
      properties:
        eventType:
          type: string
          description: The event type (the `<resource>.<event>` tail).
          examples:
            - transaction.created
        topic:
          type: string
          description: The Kafka topic the event is published on.
          examples:
            - lerian.streaming.transaction.created
        schemaVersion:
          type: string
          description: The full schema version.
          examples:
            - 1.0.0
        schemaMajor:
          type: integer
          description: The schema major.
          examples:
            - 1
        dataSchema:
          type: string
          description: >-
            An opaque schema URL passthrough. Omitted when empty; Streaming Hub
            never resolves or fetches it.
          examples:
            - https://schemas.example.com/transaction/created/1.json
        description:
          type: string
          description: A human-readable description of the event.
          examples:
            - A transaction was created.
      required:
        - eventType
        - topic
        - schemaVersion
        - schemaMajor
        - description
    Error:
      type: object
      description: >-
        RFC 9457 `application/problem+json` document returned for every
        hub-owned error across the `/v1` and `/admin` surfaces. The stable
        `code` is what a client branches on; `detail` is a caller-safe
        explanation and, for any `5xx`, is centrally scrubbed to `"internal
        error"` so no internal cause can leak. (A `403` from the authorization
        decision point ahead of the hub is the one exception — its body is plain
        text.)
      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`). Empty for huma-native
            validation faults.
          examples:
            - not_found
      required:
        - type
        - title
        - status
  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: >-
        The authorization decision point denied the request. The body is emitted
        by lib-auth ahead of the hub and is currently plain text (not
        `application/problem+json`).
      content:
        text/plain:
          schema:
            type: string
    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'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        A bearer JWT issued by plugin-auth (lib-auth). The tenant identity is
        resolved from the validated token claims; the `/v1` surface never reads
        a tenant from the body, path, or query. Machine callers obtain a token
        via the plugin-auth client-credentials flow. The `/admin` surface
        authorizes against an operator scope and carries no tenant context.

````