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

# Obtén la salud de entrega de la suscripción

> Devuelve un resumen consolidado y no secreto de la salud de entrega para una suscripción — la vista de «por qué este tenant dejó de recibir eventos». La compuerta de existencia se ejecuta primero, así que un id ausente, soft-deleted o de otro tenant devuelve un `404 not_found` uniforme. Los conteos de resultados son una vista de ventana reciente, no un total histórico.



## OpenAPI

````yaml es/openapi/v3-current/streaming-hub.yaml get /v1/subscriptions/{id}/health
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:
  /v1/subscriptions/{id}/health:
    get:
      tags:
        - Subscriptions
      summary: Obtén la salud de entrega de la suscripción
      description: >-
        Devuelve un resumen consolidado y no secreto de la salud de entrega para
        una suscripción — la vista de «por qué este tenant dejó de recibir
        eventos». La compuerta de existencia se ejecuta primero, así que un id
        ausente, soft-deleted o de otro tenant devuelve un `404 not_found`
        uniforme. Los conteos de resultados son una vista de ventana reciente,
        no un total histórico.
      operationId: getSubscriptionHealth
      parameters:
        - $ref: '#/components/parameters/SubscriptionId'
      responses:
        '200':
          description: El resumen de salud de entrega.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionHealth'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - BearerAuth: []
components:
  parameters:
    SubscriptionId:
      name: id
      in: path
      required: true
      description: The unique identifier of the subscription (UUIDv7).
      schema:
        type: string
        format: uuid
  schemas:
    SubscriptionHealth:
      type: object
      additionalProperties: false
      description: >-
        The consolidated, non-secret delivery-health rollup for one
        subscription.
      properties:
        subscription_id:
          type: string
          format: uuid
          description: The subscription the rollup describes.
          examples:
            - 0192f1a0-0000-7000-8000-00000000a001
        enabled:
          type: boolean
          description: The operator on/off flag.
          examples:
            - true
        verification_state:
          $ref: '#/components/schemas/VerificationState'
        status:
          $ref: '#/components/schemas/HealthStatus'
        delivery_outcomes:
          type: object
          additionalProperties:
            type: integer
          description: >-
            Delivery-attempt outcome counts over the configured recent window
            (keyed by outcome, e.g. `delivered`, `failed`, `dead_lettered`).
            Always an object, never null.
          examples:
            - delivered: 7
              failed: 2
              dead_lettered: 1
        recent_outcomes:
          type: object
          additionalProperties:
            type: integer
          description: >-
            The same outcome histogram restricted to the last 24 hours (a subset
            of `delivery_outcomes`). Always an object; an outcome with no recent
            activity is simply a missing key.
          examples:
            - delivered: 3
              failed: 1
        success_rate:
          type:
            - number
            - 'null'
          description: >-
            The derived per-attempt delivery rate over the window (`delivered /
            (delivered + failed + dead_lettered)`), in `[0.0, 1.0]`. `null` when
            there are zero terminal attempts (distinct from a genuine `0.0`).
            Per-attempt, not per-job, and informational only — it does not
            change `status`.
          examples:
            - 0.7
        dead_lettered:
          type: integer
          description: The count of dead-lettered attempts in the window.
          examples:
            - 1
        poison_events:
          type: integer
          description: >-
            A best-effort count of quarantined (poison) events keyed on the
            untrusted captured tenant id; drives `dropped_tenant`.
          examples:
            - 3
        dropped_tenant:
          type: boolean
          description: True when quarantined tenant events were observed.
          examples:
            - true
        consumer_lag_ms:
          type: integer
          format: int64
          description: >-
            Process consumer lag in milliseconds; `0` when no lag-as-time source
            is exposed.
          examples:
            - 12000
        auto_disabled:
          type:
            - boolean
            - 'null'
          description: >-
            The auto-disable verdict: `null` when the subscription has no
            recorded attempts yet, `false` when a health row exists with no
            verdict, `true` when auto-disable has tripped (which drives `status:
            "Down"`).
          examples:
            - true
        disabled_reason:
          type: string
          description: >-
            A fixed, secret-free auto-disable verdict token (e.g.
            `consecutive_failures`). Omitted when empty.
          examples:
            - consecutive_failures
        last_success_at:
          type: string
          format: date-time
          description: >-
            The last successful delivery timestamp (RFC 3339). Omitted when
            none.
          examples:
            - '2026-06-01T12:00:00Z'
        last_failure_at:
          type: string
          format: date-time
          description: The last failed delivery timestamp (RFC 3339). Omitted when none.
          examples:
            - '2026-06-05T09:30:00Z'
      required:
        - subscription_id
        - enabled
        - verification_state
        - status
        - delivery_outcomes
        - recent_outcomes
        - success_rate
        - dead_lettered
        - poison_events
        - dropped_tenant
        - consumer_lag_ms
        - auto_disabled
    VerificationState:
      type: string
      description: >-
        The subscription's position in the destination verification state
        machine. Only an `active` subscription is deliverable. A `webhook` sub
        is born `active`; a queue sub is born `pending_verification` and reaches
        `active` on a successful credential probe. `degraded` and `disabled`
        signal an impaired or auto-disabled destination that a successful
        `verify` returns to `active`.
      enum:
        - pending_verification
        - active
        - degraded
        - disabled
    HealthStatus:
      type: string
      description: >-
        The rolled-up delivery-health verdict. `Down` means the subscription was
        auto-disabled by the system (the endpoint is judged broken); `Degraded`
        means a lesser impairment (a manual disable, dead-lettered attempts, or
        dropped tenant events); `Healthy` otherwise.
      enum:
        - Healthy
        - Degraded
        - Down
    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
  responses:
    Unauthorized:
      description: >-
        La autenticación falló, o no hay contexto de tenant confiable. `error`
        es `unauthorized` (cuerpo uniforme — no se revela ninguna razón).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    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
    NotFound:
      description: >-
        El recurso está ausente, soft-deleted o pertenece a otro tenant — un
        `error` uniforme de `not_found` (sin oráculo de existencia).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    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.

````