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

# Consulta uma notificação.

> Devolve a notificação com o status de entrega atual, os anexos e o histórico de eventos certificados.

Como não há webhooks, esta é a forma de acompanhar uma entrega.

**Para saber se a mensagem chegou, leia `notification_delivery_status`.** O campo `notification_status` descreve o processamento interno e não acompanha a entrega: uma mensagem já lida foi observada com `notification_delivery_status` igual a `READ` e `notification_status` ainda igual a `PENDING`. Ramificar pelo campo errado faz uma mensagem lida ser reportada como não entregue.

`notification_delivery_status` nunca retrocede, e `FAILED` é terminal.




## OpenAPI

````yaml /api-reference/openapi.yaml get /notifications/{id}
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}:
    get:
      tags:
        - Notificações
      summary: Consulta uma notificação.
      description: >
        Devolve a notificação com o status de entrega atual, os anexos e o
        histórico de eventos certificados.


        Como não há webhooks, esta é a forma de acompanhar uma entrega.


        **Para saber se a mensagem chegou, leia
        `notification_delivery_status`.** O campo `notification_status` descreve
        o processamento interno e não acompanha a entrega: uma mensagem já lida
        foi observada com `notification_delivery_status` igual a `READ` e
        `notification_status` ainda igual a `PENDING`. Ramificar pelo campo
        errado faz uma mensagem lida ser reportada como não entregue.


        `notification_delivery_status` nunca retrocede, e `FAILED` é terminal.
      operationId: getNotification
      parameters:
        - $ref: '#/components/parameters/NotificationId'
      responses:
        '200':
          description: A notificação.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotificationDetail'
              examples:
                lida:
                  summary: Lida, com a cadeia de eventos certificados
                  value:
                    notification_id: PBD_NOT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                    organization_id: PBD_ORG_01J8A1B2C3D4E5F6G7H8J9K0LM
                    template_id: PBD_TPL_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                    channel: WHATSAPP
                    recipient_full_name: Maria Silva
                    recipient_tax_id: '12345678901'
                    recipient_tax_id_type: CPF
                    recipient_phone: '+5511999998888'
                    recipient_email: null
                    contact_id: PBD_CNT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                    line_id: PBD_WALN_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                    message: Prezada Maria, consta débito de R$ 1.200,00.
                    message_format: TEXT
                    notification_status: PENDING
                    notification_delivery_status: READ
                    sender:
                      name: Black101 Cobranças LTDA
                      tax_id: '12345678000199'
                      tax_id_type: CNPJ
                      contact_phone: null
                      contact_email: null
                    sender_phone: '5511952134898'
                    sender_email: null
                    created_by_user_id: PBD_APIKEY_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                    idempotency_key: cobranca-2026-08-31-0002
                    created_at: '2026-08-27T14:03:11.482Z'
                    attachments: []
                    events:
                      - event_id: PBD_EVT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
                        event_type: enqueued
                        occurred_at: '2026-08-27T14:03:11.482Z'
                        received_at: '2026-08-27T14:03:11.610Z'
                        delivery_decline_reason: null
                        attestation: null
                      - event_id: PBD_EVT_01J9Z2Q8XK3M7WPTV6RB4CYH0P
                        event_type: sent
                        occurred_at: '2026-08-27T14:03:13.100Z'
                        received_at: '2026-08-27T14:03:13.240Z'
                        delivery_decline_reason: null
                        attestation:
                          attestation_id: PBD_ATT_01J9Z2Q8XK3M7WPTV6RB4CYH0P
                          certified_at: '2026-08-27T14:03:13.510Z'
                          hash_algorithm: SHA-256
                          hash_encoding: hex
                          proof_hash: >-
                            7d5e3f1a8c6d2b0e9f7a5c3d1e8f6b4a2c0d9e7f5a3b1c8d6e4f2a0b9c7d5e3f
                      - event_id: PBD_EVT_01J9Z2Q8XK3M7WPTV6RB4CYH0Q
                        event_type: delivered
                        occurred_at: '2026-08-27T14:03:19.870Z'
                        received_at: '2026-08-27T14:03:20.010Z'
                        delivery_decline_reason: null
                        attestation:
                          attestation_id: PBD_ATT_01J9Z2Q8XK3M7WPTV6RB4CYH0Q
                          certified_at: '2026-08-27T14:03:20.330Z'
                          hash_algorithm: SHA-256
                          hash_encoding: hex
                          proof_hash: >-
                            1c8d6e4f2a0b9c7d5e3f1a8c6d2b0e9f7a5c3d1e8f6b4a2c0d9e7f5a3b1c8d6e
                      - event_id: PBD_EVT_01J9Z2Q8XK3M7WPTV6RB4CYH0R
                        event_type: read
                        occurred_at: '2026-08-27T14:07:42.115Z'
                        received_at: '2026-08-27T14:07:42.260Z'
                        delivery_decline_reason: null
                        attestation:
                          attestation_id: PBD_ATT_01J9Z2Q8XK3M7WPTV6RB4CYH0R
                          certified_at: '2026-08-27T14:07:42.580Z'
                          hash_algorithm: SHA-256
                          hash_encoding: hex
                          proof_hash: >-
                            9e7f5a3b1c8d6e4f2a0b9c7d5e3f1a8c6d2b0e9f7a5c3d1e8f6b4a2c0d9e7f5a
        '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
  schemas:
    NotificationDetail:
      allOf:
        - $ref: '#/components/schemas/Notification'
        - type: object
          description: >-
            A notificação devolvida pela consulta, com anexos e eventos
            certificados.
          properties:
            attachments:
              type: array
              description: >
                Os anexos da notificação, com a impressão digital de cada
                arquivo. Vazio quando o envio não levou anexo. São os mesmos que
                o envio já devolveu.
              items:
                $ref: '#/components/schemas/NotificationAttachment'
            events:
              type: array
              description: >
                O histórico de eventos, em ordem. A cadeia observada é
                `enqueued` → `sent` → `delivered` → `read`.


                **Nem todo evento é certificado.** Recebem atestação `sent`,
                `delivered`, `read` e `failed`. `enqueued` não: ele registra que
                a mensagem entrou na fila, e o laudo também o lista sem carimbo.
              items:
                $ref: '#/components/schemas/NotificationEvent'
    Notification:
      type: object
      description: >
        Os campos comuns a uma notificação. O envio e a consulta devolvem esta
        base com acréscimos: os dois acrescentam `attachments`, porque o arquivo
        viaja no próprio envio, e a consulta acrescenta `events`, que só existem
        depois.
      properties:
        notification_id:
          type: string
        organization_id:
          type: string
          description: >-
            A organização dona da conta e do saldo. Não confunda com `sender`,
            que é em nome de quem a notificação sai.
        template_id:
          type: string
        channel:
          type: string
          enum:
            - WHATSAPP
            - EMAIL
        recipient_full_name:
          type: string
        recipient_tax_id:
          type: string
        recipient_tax_id_type:
          type: string
          enum:
            - CPF
            - CNPJ
        recipient_phone:
          type:
            - string
            - 'null'
        recipient_email:
          type:
            - string
            - 'null'
        contact_id:
          type: string
          description: >
            O contato do destinatário no Pombo. Os contatos são unificados pelo
            `tax_id`, então o mesmo CPF devolve o mesmo `contact_id` nos dois
            canais. É por isso que dados divergentes produzem `409
            CONTACT_CONFLICT`.
          examples:
            - PBD_CNT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
        line_id:
          type:
            - string
            - 'null'
          description: A linha de WhatsApp usada no envio. `null` em `EMAIL`.
          examples:
            - PBD_WALN_01J9Z2Q8XK3M7WPTV6RB4CYH0N
        parameters:
          type: object
          additionalProperties: true
          description: >
            As variáveis exatamente como você as enviou, devolvidas para que o
            registro se descreva sozinho.
          examples:
            - '{{1}}': Maria
        message:
          type: string
          description: >
            A mensagem já renderizada, com `parameters` aplicados ao modelo. É o
            artefato que o carimbo do tempo cobre. Existe só na resposta: não há
            campo `message` de envio.
        content_sha256:
          type:
            - string
            - 'null'
          description: >
            O resumo `SHA-256` da mensagem renderizada, em hexadecimal. É a
            impressão digital do texto que consta no laudo: o equivalente, para
            a mensagem, do que `hash` é para o anexo.
          examples:
            - 3b1c8d6e4f2a0b9c7d5e3f1a8c6d2b0e9f7a5c3d1e8f6b4a2c0d9e7f5a3b1c8d
        message_format:
          type: string
          description: Se `message` é HTML ou texto simples.
        notification_status:
          type: string
          enum:
            - DRAFT
            - PENDING
            - PROCESSING
            - COMPLETED
            - FAILED
          description: >
            O processamento interno no Pombo. **Não indica entrega.** Uma
            mensagem já lida foi observada aqui como `PENDING`. Para saber se a
            pessoa recebeu, use `notification_delivery_status`.
        notification_delivery_status:
          $ref: '#/components/schemas/NotificationDeliveryStatus'
        sender:
          $ref: '#/components/schemas/Sender'
        sender_phone:
          type:
            - string
            - 'null'
          description: >
            O número de origem do WhatsApp, resolvido pelo Pombo a partir do
            pool de linhas. `null` em `EMAIL`. É o endereço de onde a mensagem
            realmente saiu, e é o que vai certificado no laudo. Não é
            `sender.contact_phone`, que é para onde o destinatário responde.
          examples:
            - '5511952134898'
        sender_email:
          type:
            - string
            - 'null'
          description: >
            O endereço de origem do e-mail, resolvido pelo Pombo. `null` em
            `WHATSAPP`. É o endereço de onde a mensagem realmente saiu, e é o
            que vai certificado no laudo. Não é `sender.contact_email`, que é
            para onde o destinatário responde.


            Se a sua organização não tem endereço próprio verificado (o caso
            comum), a mensagem sai do endereço compartilhado do Pombo, e é ele
            que aparece aqui.
          examples:
            - ola@pombo.digital
        created_by_type:
          type: string
          description: O tipo de autor do envio, que qualifica `created_by_user_id`.
        created_by_user_id:
          type: string
          description: >
            **O nome engana.** Quando o envio parte de uma credencial de API,
            este campo traz o identificador da credencial, `PBD_APIKEY_...`, e
            não um identificador de usuário.
          examples:
            - PBD_APIKEY_01J9Z2Q8XK3M7WPTV6RB4CYH0N
        idempotency_key:
          type:
            - string
            - 'null'
          description: >
            A chave que você enviou no cabeçalho `Idempotency-Key`, devolvida
            aqui para que o registro se descreva sozinho. **Só existe na
            resposta:** no envio a chave vai no cabeçalho, nunca no corpo.
        batch_id:
          type:
            - string
            - 'null'
          description: >-
            O lote a que a notificação pertence, quando veio de um envio em
            massa.
        batch_item_id:
          type:
            - string
            - 'null'
          description: O item do lote correspondente a esta notificação.
        created_at:
          type: string
          format: date-time
        sent_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Quando o Pombo entregou a mensagem ao provedor. `null` até o envio
            ocorrer.
        delivered_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            Quando o provedor confirmou a entrega ao destinatário. `null`
            enquanto não houver confirmação.
        failed_at:
          type:
            - string
            - 'null'
          format: date-time
          description: Quando o envio falhou em definitivo. `null` quando não houve falha.
        created_by_email:
          type:
            - string
            - 'null'
          description: Sempre `null` quando a chamada vem de uma credencial de API.
        created_by_name:
          type:
            - string
            - 'null'
          description: O nome da credencial que emitiu a notificação.
    NotificationAttachment:
      type: object
      description: >
        Um anexo da notificação, com a impressão digital do arquivo.


        **É aqui que você confere o que foi notificado.** O `hash` é a impressão
        digital registrada no laudo: calcule o mesmo resumo do arquivo que você
        enviou e compare, e você prova que o documento anexado é o documento que
        você tinha.
      properties:
        attachment_id:
          type: string
          description: >
            O identificador do arquivo guardado, **opaco**: é o mesmo que
            aparece no laudo, e serve para citar um anexo específico num chamado
            de suporte. Não há endpoint para resolvê-lo: tudo o que você precisa
            conferir já está nos campos ao lado.
        filename:
          type: string
          description: >
            O nome já normalizado pelo Pombo, e o nome que o destinatário
            recebeu. Compare com o que você enviou: pode não ser igual.
        mime_type:
          type: string
          enum:
            - application/pdf
            - image/png
            - image/jpeg
        size_bytes:
          type: integer
        hash:
          type: string
          description: A impressão digital do arquivo, a mesma que consta no laudo.
          examples:
            - 9f2c1d7a4b6e8f0c2a4d6e8f0b1c3d5e7f9a1b3c5d7e9f1a3b5c7d9e1f3a5b7c
        hash_algorithm:
          type: string
          description: >-
            Literalmente `SHA-256`, com hífen e em maiúsculas. Compare a string
            exata.
          examples:
            - SHA-256
        hash_encoding:
          type: string
          examples:
            - hex
    NotificationEvent:
      type: object
      description: Um evento do histórico da notificação, com a atestação que o certifica.
      properties:
        event_id:
          type: string
        event_type:
          type: string
          description: 'O evento. Cadeia observada: `enqueued`, `sent`, `delivered`, `read`.'
          examples:
            - delivered
        occurred_at:
          type: string
          format: date-time
          description: Quando o evento aconteceu.
        received_at:
          type: string
          format: date-time
          description: Quando o Pombo recebeu a notícia do evento.
        delivery_decline_reason:
          type:
            - string
            - 'null'
          description: O motivo da recusa, quando o evento é uma falha.
        attestation:
          oneOf:
            - $ref: '#/components/schemas/Attestation'
            - type: 'null'
          description: >
            `null` enquanto o evento não foi certificado, e **sempre `null` em
            `enqueued`**, que não é um evento certificável.


            A certificação é assíncrona e conclui **depois** de
            `notification_delivery_status` chegar ao estado final. Se você parar
            de consultar assim que o estado for terminal, pode ler `null` aqui.
            Continue consultando até a atestação aparecer, ou baixe o laudo em
            `GET /notifications/{id}/report/download`, que só é montado quando
            está completo.
    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
    NotificationDeliveryStatus:
      type: string
      enum:
        - PENDING
        - ENQUEUED
        - SENT
        - DELIVERED
        - READ
        - FAILED
      description: >
        **O campo que responde se a mensagem chegou.** Caminho normal: `PENDING`
        → `ENQUEUED` → `SENT` → `DELIVERED` → `READ`.


        No envio, um `EMAIL` foi observado em `ENQUEUED` e um `WHATSAPP` em
        `SENT`.


        **Nunca retrocede**, e `FAILED` é terminal. Você pode não observar todos
        os estados intermediários. Em e-mail não espere `READ`.
    Sender:
      type: object
      description: >
        Quem aparece como remetente da notificação. Permite enviar em nome
        próprio ou em nome de um cliente. Em ambos os casos o Pombo mantém o
        registro de qual credencial emitiu.


        **Não existe remetente padrão da organização nesta API:** o `sender` é
        declarado em cada envio.
      required:
        - name
        - tax_id
        - tax_id_type
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 200
          description: >
            Razão social ou nome do remetente. No máximo 200 caracteres: acima
            disso a chamada é recusada com `400 INVALID_SENDER` e a mensagem
            `sender.name must be at most 200 characters`.


            **Só texto simples.** Os caracteres `<`, `>` e `"` e os caracteres
            de controle (quebras de linha incluídas) são recusados com `400
            INVALID_SENDER` e a mensagem `sender.name must be plain text`. O
            nome é reproduzido literalmente no rodapé do e-mail e no laudo, e
            uma quebra de linha forjaria uma segunda linha de rodapé.
        tax_id:
          type: string
          pattern: ^([0-9]{11}|[0-9]{14})$
          description: >
            CPF (11 dígitos) ou CNPJ (14 dígitos), só dígitos.


            **A quantidade de dígitos não basta:** o documento é conferido pelo
            dígito verificador (MOD-11) e precisa corresponder ao `tax_id_type`
            declarado: um CNPJ declarado como `CPF` é recusado. A recusa é `400
            INVALID_SENDER`, com a mensagem `sender.tax_id must be a valid CPF`
            ou `sender.tax_id must be a valid CNPJ`.
        tax_id_type:
          type: string
          enum:
            - CPF
            - CNPJ
        contact_phone:
          type:
            - string
            - 'null'
          pattern: ^\+[0-9]{10,15}$
          description: >
            Opcional. O telefone para onde o destinatário deve responder,
            impresso no rodapé da mensagem. Não é o número de origem: esse é
            `sender_phone`, e o Pombo é quem o resolve.


            Formato internacional, começando por `+`, com 10 a 15 dígitos. Fora
            desse formato a chamada é recusada com `400 INVALID_SENDER` e a
            mensagem `sender.contact_phone must be in format +CODE_PHONE with
            10-15 digits (e.g., +5511999998888)`.


            Ausente, a linha de contato do rodapé **é omitida por inteiro**: não
            há queda para o telefone da organização.
          examples:
            - '+5511999998888'
        contact_email:
          type:
            - string
            - 'null'
          format: email
          description: Opcional. Devolvido na resposta da notificação.
    Attestation:
      type: object
      description: >
        A atestação do evento. Traz a prova em si, não um link: o download do
        laudo é `GET /notifications/{id}/report/download`.


        Quando este objeto existe, todos os seus campos estão preenchidos: ou a
        atestação está completa, ou `attestation` é `null`.
      required:
        - attestation_id
        - certified_at
        - hash_algorithm
        - hash_encoding
        - proof_hash
      properties:
        attestation_id:
          type: string
          examples:
            - PBD_ATT_01J9Z2Q8XK3M7WPTV6RB4CYH0N
        certified_at:
          type: string
          format: date-time
        hash_algorithm:
          type: string
          examples:
            - SHA-256
        hash_encoding:
          type: string
          examples:
            - hex
        proof_hash:
          type: string
  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
  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.

````