> ## Documentation Index
> Fetch the complete documentation index at: https://help.wizebot.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Resolver anexo

> Troca o `media_id` de uma mensagem por uma **URL temporária**, válida por **15 minutos** (`expires_in: 900`).

A leitura de mensagens nunca devolve URL nem caminho de armazenamento — só o identificador. Este é o lugar de resolvê-lo, e o link é curto de propósito: ele não deve circular, ser guardado nem repassado. Baixe o arquivo e resolva de novo quando precisar.

Mídia ainda em processamento responde `409` com o estado, em vez de uma URL que não funcionaria.

<Note>
  Só chame este endereço quando `media.media_id` não for `null`. Identificador nulo significa que não há arquivo registrado, e a chamada responderia `404`.
</Note>

Este recurso não depende do vínculo de identidade de canal: qualquer anexo da sua empresa resolve.



## OpenAPI

````yaml /openapi.json get /attachments/{media_id}
openapi: 3.1.0
info:
  title: API WizeBot
  version: 3.0.0
  description: >-
    A API da WizeBot tem duas camadas sobre a **mesma base**
    `https://api.wizebot.com.br/v1`.


    **Contrato multicanal** — a camada neutra. Os mesmos endpoints falam com
    WhatsApp, com Telegram e com os canais que vierem depois. O canal não
    aparece na URL nem no corpo: ele vem da conta escolhida como remetente.
    Campos, códigos e mensagens em inglês.


    **API de WhatsApp** — a camada específica do canal, com o que só o WhatsApp
    tem. Continua existindo e não muda; quem já integrou com ela não precisa
    migrar.


    Toda requisição se autentica por cabeçalho. Não há autenticação por corpo
    nem por query string.
servers:
  - url: https://api.wizebot.com.br/v1
    description: Produção
security:
  - bearerAuth: []
tags:
  - name: Canais
    description: Contas de canal conectadas e o que cada uma aceita.
  - name: Mensagens
    description: Envio e status pelo contrato neutro, em qualquer canal.
  - name: WhatsApp · Mensagens
    description: Envio, status e modelos na camada específica de WhatsApp.
  - name: WhatsApp · Contatos
    description: Contatos e campos personalizados.
  - name: WhatsApp · Etiquetas
    description: Etiquetas e sua atribuição a contatos.
  - name: WhatsApp · Sequências
    description: Sequências agendadas de um contato.
  - name: WhatsApp · Conta
    description: Verificação da chave de API.
  - name: Conversas
    description: Leitura de diagnóstico das conversas — o que está esperando resposta.
paths:
  /attachments/{media_id}:
    get:
      tags:
        - Conversas
      summary: Resolver anexo
      description: >-
        Troca o `media_id` de uma mensagem por uma **URL temporária**, válida
        por **15 minutos** (`expires_in: 900`).


        A leitura de mensagens nunca devolve URL nem caminho de armazenamento —
        só o identificador. Este é o lugar de resolvê-lo, e o link é curto de
        propósito: ele não deve circular, ser guardado nem repassado. Baixe o
        arquivo e resolva de novo quando precisar.


        Mídia ainda em processamento responde `409` com o estado, em vez de uma
        URL que não funcionaria.


        <Note>
          Só chame este endereço quando `media.media_id` não for `null`. Identificador nulo significa que não há arquivo registrado, e a chamada responderia `404`.
        </Note>


        Este recurso não depende do vínculo de identidade de canal: qualquer
        anexo da sua empresa resolve.
      operationId: resolverAnexo
      parameters:
        - name: media_id
          in: path
          required: true
          schema:
            type: string
          description: O `media.media_id` da mensagem.
      responses:
        '200':
          description: URL temporária.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    properties:
                      media_id:
                        type: string
                      message_id:
                        type: string
                      url:
                        type: string
                      expires_in:
                        type: integer
                      mime_type:
                        type:
                          - string
                          - 'null'
                      media_status:
                        type: string
                  timestamp:
                    type: string
                    format: date-time
              example:
                success: true
                data:
                  media_id: wamid.HBgN
                  message_id: a1
                  url: https://arquivos.wizebot.com.br/...
                  expires_in: 900
                  mime_type: image/jpeg
                  media_status: completed
                timestamp: '2026-09-13T03:20:00.000Z'
        '401':
          description: '`UNAUTHORIZED` — Invalid or missing API key.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDaApi'
              example:
                success: false
                statusCode: 401
                timestamp: '2026-09-13T03:20:00.000Z'
                path: /api/v1/attachments/{id}
                method: GET
                message:
                  error: UNAUTHORIZED
                  message: Invalid or missing API key.
                errorId: ERR-MTUD0DBO-KKRMP8
        '404':
          description: '`ATTACHMENT_NOT_FOUND` — Attachment not found.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDaApi'
              example:
                success: false
                statusCode: 404
                timestamp: '2026-09-13T03:20:00.000Z'
                path: /api/v1/attachments/{id}
                method: GET
                message:
                  error: ATTACHMENT_NOT_FOUND
                  message: Attachment not found.
                errorId: ERR-MTUD0DBO-KKRMP8
        '409':
          description: '`ATTACHMENT_NOT_READY` — Attachment is not available yet.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDaApi'
              example:
                success: false
                statusCode: 409
                timestamp: '2026-09-13T03:20:00.000Z'
                path: /api/v1/attachments/{id}
                method: GET
                message:
                  error: ATTACHMENT_NOT_READY
                  message: Attachment is not available yet.
                  details:
                    media_id: wamid.HBgN
                    media_status: pending
                errorId: ERR-MTUD0DBO-KKRMP8
        '429':
          description: '`RATE_LIMITED` — Too many requests.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDaApi'
              example:
                success: false
                statusCode: 429
                timestamp: '2026-09-13T03:20:00.000Z'
                path: /api/v1/attachments/{id}
                method: GET
                message:
                  error: RATE_LIMITED
                  message: Too many requests.
                errorId: ERR-MTUD0DBO-KKRMP8
        '500':
          description: '`ATTACHMENT_URL_FAILED` — Failed to resolve attachment URL.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErroDaApi'
              example:
                success: false
                statusCode: 500
                timestamp: '2026-09-13T03:20:00.000Z'
                path: /api/v1/attachments/{id}
                method: GET
                message:
                  error: ATTACHMENT_URL_FAILED
                  message: Failed to resolve attachment URL.
                errorId: ERR-MTUD0DBO-KKRMP8
components:
  schemas:
    ErroDaApi:
      type: object
      description: >-
        Corpo de erro da API. `message` é um **objeto** com o código nomeado —
        não uma string.
      required:
        - success
        - statusCode
        - message
      properties:
        success:
          type: boolean
          description: Sempre `false`.
        statusCode:
          type: integer
        timestamp:
          type: string
          format: date-time
        path:
          type: string
          description: >-
            Caminho interno da requisição. Traz o prefixo `/api/v1` mesmo quando
            você chamou por `/v1`: o apelido é reescrito antes do roteamento.
        method:
          type: string
        message:
          type: object
          required:
            - error
            - message
          properties:
            error:
              type: string
              description: >-
                Código nomeado. É por ele que se trata o erro em código, nunca
                pelo texto.
            message:
              type: string
              description: Descrição em inglês, para leitura humana.
            details:
              type: object
              additionalProperties: true
              description: >-
                Contexto estruturado, presente nos códigos que o emitem —
                `CHANNEL_MISMATCH`, `NO_OPEN_CONVERSATION`,
                `RECIPIENT_NOT_ON_CHANNEL` e `UNSUPPORTED_CAPABILITY`.
        errorId:
          type: string
          description: Identificador do erro. Cite-o ao falar com o suporte.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Chave de API no cabeçalho `Authorization: Bearer SUA-CHAVE`.


        A API também aceita `x-api-key: SUA-CHAVE` e `Authorization: ApiKey
        SUA-CHAVE` — as três formas são equivalentes, inclusive para o limite de
        requisições.


        A chave dá acesso total à conta e é de servidor para servidor: não a use
        em navegador ou aplicativo móvel.

````