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

# Registrar um delegated grant AWS

> Registra as coordenadas do delegated-grant AWS para uma assinatura de sink AWS (`sqs`, `eventbridge`) — o ARN da role de entrega entre contas (cross-account) não secreto, a região e o destino que o dispatcher assume em tempo de entrega. Esta é a escrita que ocorre depois de o cliente aplicar a trust policy dos setup-artifacts na sua conta AWS. Ela é somente escrita (write-only): não executa nenhuma sondagem inline e não altera o estado de verificação (um grant registrado permanece `pending_verification` até um `verify` posterior). Nenhuma credencial AWS trafega neste corpo. O host de destino é validado antes da escrita. Um sink não-AWS retorna `422 validation_error`.



## OpenAPI

````yaml pt/openapi/v3-current/streaming-hub.yaml put /v1/subscriptions/{id}/delegated-grant
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: >-
    A API do plano de controle do Streaming Hub. O Streaming Hub é a borda
    gerenciada de entrega de eventos da Lerian: ele consome CloudEvents do
    backbone de streaming interno da plataforma e faz o fan-out para os destinos
    externos do próprio tenant — webhooks, Amazon SQS, RabbitMQ, Amazon
    EventBridge ou uma caixa de entrada pull. Esta API permite que um tenant
    navegue pelo catálogo de eventos alimentado por manifesto, crie e gerencie
    assinaturas de entrega, verifique e rotacione suas credenciais, consulte a
    saúde da entrega e puxe (pull) os eventos aos quais tem direito.


    Os erros usam um envelope plano `{"error":"<token>"}` (um token de baixa
    cardinalidade, legível por máquina — nunca problem+json do RFC 9457). As
    operações de mutação exigem um cabeçalho `X-Idempotency` para semântica de
    no-máximo-uma-vez (at-most-once); uma requisição repetida (replay) retorna a
    resposta original byte a byte com `X-Idempotency-Replayed: true`. O catálogo
    e a superfície de eventos por pull têm escopo de tenant através do JWT
    bearer; os endpoints operacionais de sondagem (`/healthz`, `/readyz`,
    `/version`, `/runtime`, `/metrics`) não exigem autenticação. O Streaming Hub
    é closed source sob a Lerian Studio General License.
servers:
  - url: https://streaming-hub.sandbox.lerian.net
security:
  - BearerAuth: []
tags:
  - name: Catalog
    description: >-
      Navegue pelo catálogo de tipos de evento disponíveis para assinatura,
      alimentado por manifesto.
  - name: Subscriptions
    description: >-
      Crie, leia, atualize e exclua assinaturas de entrega e conduza o ciclo de
      vida de verificação do destino (ping, verify, credential, delegated grant,
      rotação de segredo, saúde).
  - name: Event Delivery
    description: >-
      Puxe (pull) os eventos aos quais uma assinatura de sink pull tem direito
      (leitura com cursor-como-confirmação).
  - name: Admin
    description: >-
      Análise forense de operador entre tenants (cross-tenant). Exige um escopo
      de autorização de operador.
  - name: Operational
    description: >-
      Sondagens não autenticadas de liveness, readiness, build, runtime e
      métricas.
paths:
  /v1/subscriptions/{id}/delegated-grant:
    put:
      tags:
        - Subscriptions
      summary: Registrar um delegated grant AWS
      description: >-
        Registra as coordenadas do delegated-grant AWS para uma assinatura de
        sink AWS (`sqs`, `eventbridge`) — o ARN da role de entrega entre contas
        (cross-account) não secreto, a região e o destino que o dispatcher
        assume em tempo de entrega. Esta é a escrita que ocorre depois de o
        cliente aplicar a trust policy dos setup-artifacts na sua conta AWS. Ela
        é somente escrita (write-only): não executa nenhuma sondagem inline e
        não altera o estado de verificação (um grant registrado permanece
        `pending_verification` até um `verify` posterior). Nenhuma credencial
        AWS trafega neste corpo. O host de destino é validado antes da escrita.
        Um sink não-AWS retorna `422 validation_error`.
      operationId: putSubscriptionDelegatedGrant
      parameters:
        - $ref: '#/components/parameters/SubscriptionId'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DelegatedGrantRequest'
      responses:
        '200':
          description: >-
            O grant foi persistido (sem corpo; o estado de verificação permanece
            inalterado).
          headers:
            X-Idempotency-Replayed:
              $ref: '#/components/headers/IdempotencyReplayed'
        '400':
          $ref: '#/components/responses/BadRequestOrMissingIdempotency'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/IdempotencyConflict'
        '422':
          description: >-
            A requisição é corrigível pelo chamador. `error` é
            `validation_error` (um `roleArn` / `region` / `destination` ausente,
            ou um sink não-AWS) ou `endpoint_blocked` (o host de destino
            resolveu para um endereço bloqueado, privado ou de metadados).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '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
    IdempotencyKey:
      name: X-Idempotency
      in: header
      required: true
      description: >-
        A client-chosen unique key that makes this mutation at-most-once. A
        mutation sent without it is rejected before any write with `400
        missing_idempotency_key`. Reusing the same key with an identical request
        replays the original response byte-for-byte (with
        `X-Idempotency-Replayed: true`); reusing it with a different request
        body returns `409 idempotency_conflict`. To re-drive a corrected
        request, mint a new key.
      schema:
        type: string
  schemas:
    DelegatedGrantRequest:
      type: object
      additionalProperties: false
      description: >-
        The non-secret AWS delegated-grant coordinates. No AWS credential
        crosses this body — the role is assumed per delivery, guarded by the
        separately minted `ExternalId`.
      properties:
        roleArn:
          type: string
          description: >-
            The cross-account delivery role ARN Streaming Hub assumes at
            delivery time.
          examples:
            - arn:aws:iam::444455556666:role/streaming-hub-delegated-delivery
        region:
          type: string
          description: The AWS region of the destination.
          examples:
            - us-east-1
        destination:
          type: string
          description: >-
            The resolved destination (queue URL or event-bus ARN).
            SSRF-validated before the write.
          examples:
            - https://sqs.us-east-1.amazonaws.com/444455556666/orders
      required:
        - roleArn
        - region
        - destination
    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
  headers:
    IdempotencyReplayed:
      description: >-
        Presente e definido como `true` quando esta resposta é um replay de uma
        requisição previamente confirmada que carrega a mesma chave
        `X-Idempotency` (o handler não rodou de novo).
      schema:
        type: string
        enum:
          - 'true'
  responses:
    BadRequestOrMissingIdempotency:
      description: >-
        O corpo da requisição está malformado (`bad_request`) ou o cabeçalho
        obrigatório `X-Idempotency` está ausente (`missing_idempotency_key`,
        rejeitado antes de qualquer escrita).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: >-
        A autenticação falhou, ou não há contexto de tenant confiável. `error` é
        `unauthorized` (corpo uniforme — nenhuma razão é revelada).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: >-
        O ponto de decisão de autorização (authorization decision point) negou a
        requisição. O corpo é texto puro (não o envelope de erro JSON).
      content:
        text/plain:
          schema:
            type: string
    NotFound:
      description: >-
        O recurso está ausente, soft-deleted ou pertence a outro tenant — um
        `error` uniforme de `not_found` (sem oráculo de existência).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    IdempotencyConflict:
      description: >-
        Uma duplicata em andamento (in-flight), ou a mesma chave `X-Idempotency`
        foi reutilizada com um fingerprint de requisição diferente — `error` é
        `idempotency_conflict`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    InternalError:
      description: >-
        Uma falha de infraestrutura. `error` é `internal_error` (sanitizado; o
        detalhe é logado, nunca retornado).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Um JWT bearer emitido pelo plugin-auth (lib-auth). A identidade do
        tenant é resolvida a partir das claims validadas do token; a superfície
        `/v1` nunca lê um tenant do corpo, do path ou da query. Chamadores de
        máquina obtêm um token via o fluxo client-credentials do plugin-auth. A
        superfície `/admin` autoriza contra um escopo de operador e não carrega
        contexto de tenant.

````