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

# Baixa o laudo da notificação.

> Devolve o **Relatório Técnico de Rastreabilidade**, o laudo com carimbo do tempo ICP-Brasil que comprova a notificação.

**A resposta é o PDF em si**, com `Content-Type: application/pdf`, não um link. Grave os bytes em disco.

Gere o laudo depois de a notificação atingir um estado final, para que ele reflita o resultado completo da entrega.




## OpenAPI

````yaml /api-reference/openapi.yaml get /notifications/{id}/report/download
openapi: 3.1.0
info:
  title: API do Pombo.Digital
  version: 1.0.0
  description: >
    Envie notificações extrajudiciais certificadas por WhatsApp ou e-mail,
    acompanhe a entrega e baixe o laudo com carimbo do tempo ICP-Brasil.


    A credencial identifica a organização por si só: `organization_id` não é
    aceito em nenhuma requisição desta API.
servers:
  - url: https://pombo.digital/api/integrations/v1
    description: Produção
security:
  - bearerAuth: []
tags:
  - name: Notificações
    description: >-
      Criar uma notificação extrajudicial, acompanhar a entrega e baixar o
      laudo.
  - name: Modelos
    description: >-
      Modelos de mensagem. Um envio de WhatsApp exige um modelo aprovado pela
      Meta.
paths:
  /notifications/{id}/report/download:
    get:
      tags:
        - Notificações
      summary: Baixa o laudo da notificação.
      description: >
        Devolve o **Relatório Técnico de Rastreabilidade**, o laudo com carimbo
        do tempo ICP-Brasil que comprova a notificação.


        **A resposta é o PDF em si**, com `Content-Type: application/pdf`, não
        um link. Grave os bytes em disco.


        Gere o laudo depois de a notificação atingir um estado final, para que
        ele reflita o resultado completo da entrega.
      operationId: downloadNotificationReport
      parameters:
        - $ref: '#/components/parameters/NotificationId'
      responses:
        '200':
          description: O laudo, em PDF.
          headers:
            Content-Disposition:
              description: >-
                Sempre `attachment`, com o nome
                `relatorio_pombo_digital_<notification_id>.pdf`.
              schema:
                type: string
                examples:
                  - >-
                    attachment;
                    filename="relatorio_pombo_digital_PBD_NOT_01J9Z2Q8XK3M7WPTV6RB4CYH0N.pdf"
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    NotificationId:
      name: id
      in: path
      required: true
      description: O identificador da notificação.
      schema:
        type: string
        pattern: ^PBD_NOT_[0-9A-HJKMNP-TV-Z]{26}$
        examples:
          - PBD_NOT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
  responses:
    Unauthorized:
      description: >
        Credencial ausente, inválida ou revogada. A resposta é **idêntica** nos
        três casos: o Pombo não informa qual deles ocorreu, para que não se
        possa descobrir por tentativa quais credenciais já existiram.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            invalida:
              summary: Credencial não aceita
              value:
                code: 10401
                http_code: 401
                message: Invalid API key
    NotFound:
      description: >
        Recurso não encontrado. Um recurso de **outra organização** também
        responde `404`, e não `403`, porque a distinção revelaria que o
        identificador existe. Vale para os dois `GET` e também para o
        `template_id` de um envio.


        O `404` de modelo em `POST /notifications` é devolvido direto pela rota,
        então **não traz `request_id` no corpo**, ao contrário dos erros que
        passam pelo tratador geral. O cabeçalho `x-request-id` está sempre lá:
        use o cabeçalho.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            numerico:
              summary: Código numérico
              value:
                code: 10404
                http_code: 404
                message: Template not found
            texto:
              summary: Código em texto
              value:
                code: NOT_FOUND
                http_code: 404
                message: Notification not found
    TooManyRequests:
      description: >
        Limite de requisições excedido. São três contagens independentes, em
        janelas de um minuto: 50 por credencial, 200 por organização, 300 por
        IP.


        **Espere o que o `Retry-After` manda esperar**, em segundos. Os
        cabeçalhos `RateLimit-Limit`, `RateLimit-Remaining` e `RateLimit-Reset`
        vêm em toda resposta, não só no `429`.
      headers:
        Retry-After:
          description: Quantos segundos esperar antes de repetir.
          schema:
            type: integer
            examples:
              - 43
        RateLimit-Limit:
          description: O teto da janela.
          schema:
            type: integer
            examples:
              - 200
        RateLimit-Remaining:
          description: Quantas requisições ainda cabem na janela.
          schema:
            type: integer
            examples:
              - 0
        RateLimit-Reset:
          description: Quantos segundos faltam para a janela virar.
          schema:
            type: integer
            examples:
              - 43
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            limite:
              summary: Limite excedido
              value:
                code: RATE_LIMIT_EXCEEDED
                http_code: 429
                message: Too many requests. Please try again later.
    InternalError:
      description: >
        Erro interno. Em `POST /notifications`, um `500` **não garante que nada
        foi enviado**: consulte antes de repetir.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/InternalError'
          examples:
            interno:
              summary: Erro interno
              value:
                code: INTERNAL_ERROR
                message: Internal Server Error
                request_id: req_01M1C5ZKGBGRNW6QHXTP2EM7Y7
  schemas:
    Error:
      type: object
      description: >
        O envelope de erro, com quatro campos.


        **Ramifique pelo status HTTP e por `error_code`. Nunca por `code`.** O
        `code` vale `10000 + http_code` em um caminho e uma string arbitrária em
        outro, então não acrescenta nada ao status e muda de tipo entre
        operações vizinhas.
      required:
        - message
      properties:
        code:
          description: >
            **Não ramifique por este campo.** O tipo muda entre operações
            vizinhas: um `404` de modelo traz `10404` e um `404` de notificação
            traz `"NOT_FOUND"`. Para tratar erros em código, use o status HTTP.
          oneOf:
            - title: Número, na validação genérica
              type: integer
              description: >-
                `10000 + http_code`. Um `400` genérico traz `10400`, um `404`
                traz `10404`.
              examples:
                - 10400
            - title: Texto, nos erros específicos
              type: string
              description: Um identificador do erro, como os listados em Erros.
              examples:
                - IDEMPOTENCY_KEY_REUSED
        http_code:
          type: integer
          description: >
            **Opcional.** O status HTTP repetido no corpo. Presente quando o
            erro é devolvido diretamente, ausente quando é lançado e tratado
            pelo tratador geral. Nunca exija este campo no cliente.
        message:
          type: string
          description: >-
            Descrição da falha, para diagnóstico. Em inglês ou em português. Não
            é estável.
        error_code:
          type: string
          enum:
            - MISSING_REQUIRED_FIELD
            - INVALID_SENDER
            - ORGANIZATION_ID_FORBIDDEN
            - INVALID_RECIPIENT
            - TEMPLATE_CONSTANT_FORBIDDEN
            - FILE_TRANSFER_NOT_AVAILABLE_ON_THIS_LANE
            - IDEMPOTENCY_KEY_REUSED
          description: >
            O campo a usar para ramificar. **Opcional na prática:** alguns `400`
            igualmente específicos não o trazem, como o de
            `recipient_tax_id_type` fora do enum e o de `Idempotency-Key` mal
            formado. Quando estiver ausente, use o status HTTP.
    InternalError:
      type: object
      description: O corpo do `500` é reduzido e **não** traz `http_code`.
      properties:
        code:
          type: string
          examples:
            - INTERNAL_ERROR
        message:
          type: string
          examples:
            - Internal Server Error
        request_id:
          type: string
          description: >
            O mesmo valor do cabeçalho `x-request-id`. **Registre-o:** é por ele
            que o suporte encontra a requisição exata.
          examples:
            - req_01M1C5ZKGBGRNW6QHXTP2EM7Y7
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Sua credencial de API no cabeçalho `Authorization: Bearer sk_live_...`.
        Crie e revogue credenciais no painel, em Conta → API Keys. O segredo
        aparece uma única vez, na criação.


        A credencial identifica a organização: `organization_id` não é aceito em
        nenhuma requisição.

````