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

# Lista las observaciones de dead-letter

> Análisis forense de operador entre tenants: devuelve una página keyset-paginada y en orden cronológico inverso de observaciones de dead-letter capturadas del pipeline de entrega. Esta es una superficie de operador — autoriza contra un scope de operador y no transporta contexto de tenant. La proyección no transporta ningún secreto, ninguna URL de endpoint de cliente ni material de firma. El campo `tenant_id_raw` es una captura no confiable y de mejor esfuerzo, expuesta solo por su valor forense.



## OpenAPI

````yaml es/openapi/v3-current/streaming-hub.yaml get /admin/dlq
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: >-
    La API de control-plane de Streaming Hub. Streaming Hub es el borde
    gestionado de entrega de eventos de Lerian: consume CloudEvents del backbone
    de streaming interno de la plataforma y los distribuye a los destinos
    externos propios de cada tenant — webhooks, Amazon SQS, RabbitMQ, Amazon
    EventBridge o una bandeja de entrada de tipo pull. Esta API permite a un
    tenant explorar el catálogo de eventos alimentado por el manifest, crear y
    gestionar suscripciones de entrega, verificar y rotar sus credenciales, leer
    la salud de entrega y hacer pull de los eventos a los que tiene derecho.


    Los errores usan un envelope plano `{"error":"<token>"}` (un token de baja
    cardinalidad y legible por máquina — nunca RFC 9457 problem+json). Las
    operaciones de mutación requieren un header `X-Idempotency` para semántica
    at-most-once; una petición reproducida (replay) devuelve la respuesta
    original byte a byte con `X-Idempotency-Replayed: true`. El catálogo y la
    superficie de eventos pull están acotados por tenant a través del JWT
    bearer; los endpoints operacionales de sonda (`/healthz`, `/readyz`,
    `/version`, `/runtime`, `/metrics`) no requieren autenticación. Streaming
    Hub es de código cerrado bajo la Lerian Studio General License.
servers:
  - url: https://streaming-hub.sandbox.lerian.net
security:
  - BearerAuth: []
tags:
  - name: Catalog
    description: >-
      Explora el catálogo de tipos de evento disponibles para suscripción,
      alimentado por el manifest.
  - name: Subscriptions
    description: >-
      Crea, lee, actualiza y elimina suscripciones de entrega, y gestiona el
      ciclo de vida de verificación del destino (ping, verify, credential,
      delegated grant, rotación de secreto, health).
  - name: Event Delivery
    description: >-
      Haz pull de los eventos a los que tienes derecho para una suscripción de
      tipo pull (lectura cursor-as-acknowledgment).
  - name: Admin
    description: >-
      Análisis forense de operador entre tenants. Requiere un scope de
      autorización de operador.
  - name: Operational
    description: >-
      Sondas de liveness, readiness, build, runtime y métricas sin
      autenticación.
paths:
  /admin/dlq:
    get:
      tags:
        - Admin
      summary: Lista las observaciones de dead-letter
      description: >-
        Análisis forense de operador entre tenants: devuelve una página
        keyset-paginada y en orden cronológico inverso de observaciones de
        dead-letter capturadas del pipeline de entrega. Esta es una superficie
        de operador — autoriza contra un scope de operador y no transporta
        contexto de tenant. La proyección no transporta ningún secreto, ninguna
        URL de endpoint de cliente ni material de firma. El campo
        `tenant_id_raw` es una captura no confiable y de mejor esfuerzo,
        expuesta solo por su valor forense.
      operationId: listDeadLetters
      parameters:
        - name: source_topic
          in: query
          required: false
          description: >-
            Optional filter on the source topic the failed delivery originated
            from.
          schema:
            type: string
        - name: error_class
          in: query
          required: false
          description: >-
            Optional filter on the transport error class. An unrecognized value
            returns `400 invalid_error_class`.
          schema:
            $ref: '#/components/schemas/DLQErrorClass'
        - name: after
          in: query
          required: false
          description: >-
            Keyset cursor — the `id` (UUIDv7) of the last row from the previous
            page. A malformed value returns `400 invalid_cursor`.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Una página de observaciones de dead-letter.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DLQResponse'
        '400':
          description: >-
            Un valor de filtro era inválido. `error` es `invalid_error_class`
            (un `error_class` no reconocido) o `invalid_cursor` (un `after`
            malformado).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: >-
            La autenticación falló. En esta superficie de operador el cuerpo es
            texto plano (no el envelope de error JSON) — a diferencia de la
            superficie `/v1`, el grupo `/admin` emite el 401 directamente desde
            el middleware de autorización.
          content:
            text/plain:
              schema:
                type: string
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - BearerAuth: []
components:
  schemas:
    DLQErrorClass:
      type: string
      description: The transport error class a dead-letter observation may be filtered on.
      enum:
        - serialization
        - validation
        - auth
        - topic_not_found
        - broker_unavailable
        - network_timeout
        - broker_overloaded
        - context_canceled
        - unknown
    DLQResponse:
      type: object
      additionalProperties: false
      properties:
        observations:
          type: array
          description: A page of dead-letter observations, reverse-chronological.
          items:
            $ref: '#/components/schemas/DLQObservation'
        nextCursor:
          type: string
          description: >-
            Keyset cursor for the next (older) page — the id of the last row.
            Empty when there are no further pages.
          examples:
            - 0192f1a0-0000-7000-8000-00000000d017
      required:
        - observations
        - nextCursor
    Error:
      type: object
      additionalProperties: false
      description: >-
        The flat error envelope used across the `/v1` and `/admin` surfaces. It
        carries a single low-cardinality, machine-readable token and never leaks
        secret material or internal detail. (A `403` from the authorization
        decision point is the one exception — its body is plain text.)
      properties:
        error:
          type: string
          description: The machine-readable error token.
          examples:
            - not_found
      required:
        - error
    DLQObservation:
      type: object
      additionalProperties: false
      description: >-
        One dead-letter observation. Carries no secret, no customer endpoint
        URL, and no signing material. `tenant_id_raw` is an untrusted,
        best-effort capture surfaced for forensic value only.
      properties:
        source_topic:
          type: string
          description: The source topic the failed delivery originated from.
          examples:
            - lerian.streaming.transaction.created
        error_class:
          type: string
          description: The transport error class captured for the failed delivery.
          examples:
            - broker_unavailable
        error_message:
          type: string
          description: >-
            A sanitized error message (redacted at capture; never a secret or
            host:port).
          examples:
            - connection refused
        retry_count:
          type: integer
          description: The number of delivery attempts recorded before dead-lettering.
          examples:
            - 8
        first_failure_at:
          type: string
          format: date-time
          description: When the first failure was observed (UTC, RFC 3339).
          examples:
            - '2026-06-05T09:00:00Z'
        producer_id:
          type: string
          description: The producer identity captured for the source event.
          examples:
            - midaz
        observed_at:
          type: string
          format: date-time
          description: When the dead-letter observation was recorded (UTC, RFC 3339).
          examples:
            - '2026-06-05T09:30:00Z'
        tenant_id_raw:
          type: string
          description: >-
            The untrusted captured tenant id. Forensic only — never an
            authorization or scoping input.
          examples:
            - tenant-acme
      required:
        - source_topic
        - error_class
        - error_message
        - retry_count
        - first_failure_at
        - producer_id
        - observed_at
        - tenant_id_raw
  responses:
    Forbidden:
      description: >-
        El punto de decisión de autorización denegó la petición. El cuerpo es
        texto plano (no el envelope de error JSON).
      content:
        text/plain:
          schema:
            type: string
    InternalError:
      description: >-
        Un fallo de infraestructura. `error` es `internal_error` (sanitizado; el
        detalle se registra, nunca se devuelve).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Un JWT bearer emitido por plugin-auth (lib-auth). La identidad del
        tenant se resuelve a partir de los claims validados del token; la
        superficie `/v1` nunca lee un tenant del cuerpo, del path ni de la
        query. Los llamadores de máquina obtienen un token vía el flujo
        client-credentials de plugin-auth. La superficie `/admin` autoriza
        contra un scope de operador y no lleva contexto de tenant.

````