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

# Descargar archivo de un mensaje

> Descarga el archivo asociado a un mensaje de medios (imagen, video, audio, documento o sticker).

## Parámetros

- **id** (string, obligatorio): ID del mensaje
- **return_base64** (boolean, default: false): Incluye el archivo en base64. Evite esta opción porque aumenta el uso de memoria, el procesamiento y el tamaño de la respuesta. Versiones futuras podrán limitar base64 para archivos de más de 5 MB.
- **generate_mp3** (boolean, default: true): Para audios, define el formato de retorno
  - `true`: Devuelve MP3
  - `false`: Devuelve OGG
- **return_link** (boolean, mantenido por compatibilidad): La respuesta incluye la URL pública del archivo
- **transcribe** (boolean, default: false): Transcribe audios a texto
- **openai_apikey** (string, opcional): Clave de OpenAI para la transcripción
  - Si no se informa, usa la clave guardada en la instancia
  - Si se informa, se actualiza y se guarda en la instancia para las próximas llamadas
- **download_quoted** (boolean, default: false): Descarga los medios del mensaje citado
  - Útil para descargar el contenido original de estados de WhatsApp
  - Cuando un mensaje es respuesta a un estado, permite descargar los medios del estado original
  - **Contextualización**: Al descargar los medios citados, usted identifica el contexto de la conversación
    - Ejemplo: Si alguien responde a una promoción, al descargar los medios sabrá que la pregunta es sobre esa promoción específica

## Ejemplos

### Descargar audio como MP3:
```json
{
  "id": "7EB0F01D7244B421048F0706368376E0",
  "generate_mp3": true
}
```

### Transcribir audio:
```json
{
  "id": "7EB0F01D7244B421048F0706368376E0",
  "transcribe": true
}
```

### Incluir el contenido en base64:
```json
{
  "id": "7EB0F01D7244B421048F0706368376E0",
  "return_base64": true
}
```

### Descargar medios de estado (mensaje citado):
```json
{
  "id": "7EB0F01D7244B421048F0706368376E0",
  "download_quoted": true
}
```
*Útil cuando el cliente responde a una promoción/estado: usted descarga los medios originales para entender sobre qué producto/oferta está preguntando.*

## Respuesta

```json
{
  "fileURL": "https://api.exemplo.com/files/arquivo.mp3",
  "mimetype": "audio/mpeg",
  "base64Data": "UklGRkj...",
  "transcription": "Texto transcrito"
}
```

**Nota**:
- Por defecto, los audios se devuelven como MP3 y todas las descargas incluyen una URL pública en `fileURL`.
- Evite `return_base64: true`: la conversión aumenta el uso de memoria y procesamiento en el servidor y produce una respuesta más grande. Prefiera descargar el archivo mediante `fileURL`.
- Compatibilidad futura: el retorno en base64 podrá limitarse para archivos de más de 5 MB. No dependa de base64 para archivos grandes.
- La transcripción requiere una clave de OpenAI válida. La clave puede configurarse una vez en la instancia y se reutilizará automáticamente.
- Retención de medios: el archivo queda disponible en nuestro CDN durante 2 días. Después de eso, `fileURL` deja de funcionar. Llame de nuevo a este endpoint para generar una nueva URL, mientras el mensaje y los medios originales sigan disponibles.
- Para conservar los medios por más de 2 días, descargue el archivo mediante `fileURL` y guárdelo en un almacenamiento propio. Guardar solo la URL no amplía el plazo de retención.




## OpenAPI

````yaml /openapi-es.json post /message/download
openapi: 3.1.0
info:
  title: WppFy -  WhatsApp API
  version: 1.0.0
  description: >
    API para la gestión de instancias de WhatsApp y comunicaciones.


    ## Recomendación Importante: WhatsApp Business

    **Se RECOMIENDA ENCARECIDAMENTE usar cuentas de WhatsApp Business** en lugar
    de WhatsApp normal para la integración; WhatsApp normal puede presentar
    inconsistencias, desconexiones, limitaciones e inestabilidad durante el uso
    con nuestra API.


    ## Autenticación

    - Los endpoints regulares requieren un header 'token' con el token de la
    instancia


    ## Estados de la Instancia

    Las instancias pueden estar en los siguientes estados:

    - `disconnected`: Desconectado de WhatsApp

    - `connecting`: En proceso de conexión

    - `connected`: Conectado y autenticado con éxito
servers:
  - url: https://api.wppfy.com
security:
  - token: []
tags:
  - name: Instancia
    description: >
      Operaciones relacionadas con el ciclo de vida de una instancia, como
      conectar,

      desconectar y verificar el estado.
  - name: Proxy
    description: >
      WppFy opera con un proxy interno por defecto.

      Puede mantener este valor predeterminado, configurar un proxy propio
      mediante `proxy_url` o usar su celular Android como proxy instalando la
      app en https://github.com/WppFy/silver_proxy_apk (APK directo:
      https://github.com/WppFy/silver_proxy_apk/raw/refs/heads/main/silver_proxy.apk).

      Si no se envía nada, se sigue usando el proxy interno. Las IPs son
      brasileñas; para clientes internacionales, considere un proxy de la región
      del cliente.
  - name: Perfil
    description: >
      Operaciones relacionadas con el perfil de la instancia de WhatsApp, como
      cambiar

      el nombre y la imagen de perfil.
  - name: Business
    description: >
      ⚠️ **EXPERIMENTAL** - Endpoints aún no probados por completo.


      Operaciones relacionadas con el perfil comercial de WhatsApp Business.

      Permite consultar y actualizar datos del perfil comercial como
      descripción,

      dirección, email, categorías y gestionar el catálogo de productos.


      **Requisitos:**

      - La cuenta conectada actualmente debe ser una cuenta **WhatsApp
      Business**

      - Las cuentas personales de WhatsApp no tienen perfil comercial


      **Nota:** Estos endpoints pueden no funcionar como se espera.

      Reporte los problemas encontrados.
  - name: Llamadas
    description: |
      Operaciones relacionadas con llamadas por WhatsApp.
      Permite realizar y rechazar llamadas de forma programática.
  - name: Enviar Mensaje
    description: >
      Endpoints para el envío de mensajes de WhatsApp con diferentes tipos de
      contenido.


      ## Campos Opcionales Comunes


      Todos los endpoints de envío de mensajes soportan los siguientes campos
      opcionales:


      - **`delay`** *(integer)*: Retraso en milisegundos antes del envío
        - Durante el retraso aparecerá "Escribiendo..." o "Grabando audio..." según el tipo
        - Ejemplo: `5000` (5 segundos)

      - **`readchat`** *(boolean)*: Marcar el chat como leído después del envío
        - Quita el contador de mensajes no leídos del chat
        - Ejemplo: `true`

      - **`readmessages`** *(boolean)*: Marcar los últimos mensajes recibidos
      como leídos
        - Marca los últimos 10 mensajes **recibidos** (no enviados por usted) como leídos
        - Útil para confirmar la lectura de mensajes pendientes antes de responder
        - A diferencia de `readchat`, que solo quita el contador de no leídos
        - Ejemplo: `true`

      - **`replyid`** *(string)*: ID del mensaje a responder
        - Crea una respuesta vinculada al mensaje original
        - El soporte varía según el tipo de mensaje
        - Ejemplo: `"3A12345678901234567890123456789012"`

      - **`mentions`** *(string)*: Números a mencionar (solo para envíos en
      grupos)
        - Números específicos: `"5511999999999,5511888888888"`
        - Mencionar a todos: `"all"`

      - **`forward`** *(boolean)*: Marca el mensaje como reenviado en WhatsApp
        - Agrega el indicador "Reenviado" al mensaje
        - Ejemplo: `true`

      - **`track_source`** *(string)*: Origen del rastreo del mensaje
        - Identifica el sistema o la fuente que está enviando el mensaje
        - Útil para integraciones (ej.: "chatwoot", "crm", "chatbot")
        - Ejemplo: `"chatwoot"`

      - **`track_id`** *(string)*: ID para el rastreo del mensaje
        - Identificador libre para dar seguimiento al mensaje en sistemas externos
        - Permite correlacionar mensajes entre diferentes plataformas
        - **Nota**: El sistema acepta valores duplicados; no hay validación de unicidad
        - Use el mismo ID en varios mensajes si tiene sentido para su integración
        - Ejemplo: `"msg_123456789"`

      ### Envío a Grupos

      - **`number`** *(string)*: Para enviar un mensaje a un grupo, use el ID
      del grupo que termina en `@g.us`
        - Ejemplo: `"120363012345678901@g.us"`
        - **Cómo obtener el ID del grupo:**
          - Use el `chatid` del webhook recibido cuando alguien envía un mensaje en el grupo
          - Use el endpoint `GET /group/list` para listar todos los grupos y sus IDs

      ## Placeholders Disponibles


      Todos los endpoints de envío de mensajes soportan placeholders dinámicos
      para personalización automática:


      ### Campos de Nombre

      - **`{{name}}`**: Nombre consolidado del chat, usando la primera opción
      disponible:
        1. Nombre del lead (`lead_name`)
        2. Nombre completo del lead (`lead_fullName`)
        3. Nombre del contacto en WhatsApp (`wa_contactName`)
        4. Nombre del perfil de WhatsApp (`wa_name`)

      - **`{{first_name}}`**: Primera palabra válida del nombre consolidado
      (mínimo 2 caracteres)


      ### Campos de WhatsApp

      - **`{{wa_name}}`**: Nombre del perfil de WhatsApp

      - **`{{wa_contactName}}`**: Nombre del contacto tal como está guardado en
      WhatsApp


      ### Campos del Lead

      - **`{{lead_name}}`**: Nombre del lead

      - **`{{lead_fullName}}`**: Nombre completo del lead

      - **`{{lead_personalid}}`**: ID personal (CPF, CNPJ, etc)

      - **`{{lead_email}}`**: Email del lead

      - **`{{lead_status}}`**: Estado actual del lead

      - **`{{lead_notes}}`**: Anotaciones del lead

      - **`{{lead_assignedAttendant_id}}`**: ID del agente asignado


      ### Campos Personalizados

      Los campos agregados mediante custom fields son accesibles usando
      `{{lead_field01}}` a `{{lead_field20}}` o usando `{{nomedocampo}}`
      definido en `/instance/updateFieldsMap`.


      ### Ejemplo de Uso

      ```

      ¡Hola {{name}}! Vi que usted trabaja en {{company}}.

      ¿Su email {{lead_email}} es correcto?

      ```


      **💡 Consejo**: Use `/chat/find` para buscar los datos del chat y ver los
      campos disponibles antes de enviar mensajes con placeholders.
  - name: Mensaje Async
    description: >
      Controles operativos de la cola interna de envío asíncrono usada cuando un
      endpoint de envío recibe `async=true`.


      Esta sección sirve para:

      - consultar el estado actual de la cola async

      - configurar el delay entre mensajes enviados con `async=true`

      - limpiar el backlog pendiente y cancelar mensajes aún no concluidos


      Alcance:

      - cubre solo la cola interna de mensajes directos async

      - no modifica mensajes ya enviados correctamente
  - name: Acciones en el mensaje y Búsqueda
  - name: Chats
  - name: Contactos
  - name: Bloqueos
  - name: Etiquetas
  - name: Grupos y Comunidades
  - name: Newsletters y Canales
    description: >
      Operaciones para la lectura y el seguimiento de canales de WhatsApp
      (newsletters).


      Casos de uso principales:

      - listar posts ya publicados en un canal

      - editar posts recientes de un canal

      - eliminar posts recientes de un canal

      - consultar views y reacciones de los posts

      - integrar canales sin necesidad de persistir los mensajes localmente


      Observaciones:

      - `/newsletter/messages` devuelve el contenido de los posts

      - `/newsletter/messages/edit` edita el contenido de posts recientes

      - `/newsletter/messages/delete` elimina posts recientes

      - las views (`viewsCount`) y reactions (`reactionCounts`) vienen en cada
      post de `/newsletter/messages`, no por evento de webhook

      - `/newsletter/updates` está obsoleta: WhatsApp no responde y la API
      devuelve 504

      - los newsletters usan rutas propias y no deben usar `/message/edit` ni
      `/message/delete`
  - name: Respuestas Rápidas
    description: >
      Gestión de respuestas rápidas para agilizar la atención.


      **⚠️ Importante**: Este recurso solo es útil si utiliza un sistema
      frontend/interfaz

      personalizada para registrar y utilizar las respuestas. La API solo
      almacena las respuestas, 

      pero no las aplica automáticamente.


      ### Cómo funciona:

      - **Crear**: Registre respuestas predefinidas con títulos y contenido

      - **Listar**: Recupere todas las respuestas registradas para mostrarlas en
      su interfaz

      - **Usar**: Su sistema frontend puede usar estas respuestas para agilizar
      la escritura


      ### Casos de uso:

      - Interfaces web personalizadas de atención

      - Apps móviles con sugerencias de respuesta

      - Sistemas CRM con plantillas de mensaje

      - Herramientas de productividad para agentes


      **No es un chatbot**: Para respuestas automáticas, use los recursos de
      Chatbot.
  - name: CRM
    description: >
      Sistema completo de gestión de relaciones con clientes integrado a la API.


      **💾 Almacenamiento interno**: Todos los datos de los leads se guardan
      directamente en la API,

      eliminando la necesidad de bases de datos externas. Su aplicación puede
      enfocarse solo

      en la interfaz y la lógica de negocio.


      ### Recursos disponibles:

      - **📋 20+ campos personalizables**: Nombre, teléfono, email, empresa,
      observaciones, etc.

      - **🏷️ Sistema de etiquetas**: Organice y categorice sus contactos

      - **🔍 Búsqueda avanzada**: Filtre por cualquier campo o etiqueta

      - **📊 Historial completo**: Todas las interacciones se registran
      automáticamente


      ### 🎯 Placeholders en mensajes:

      Use variables dinámicas en los mensajes para la personalización
      automática:


      ```

      ¡Hola {{nombre}}! Vi que trabaja en {{empresa}}.

      ¿Su email {{email}} es correcto?

      Observaciones: {{observaciones}}

      ```


      ### Flujo típico:

      1. **Captura**: Los leads llegan vía WhatsApp o formularios

      2. **Enriquecimiento**: Agregue datos usando `/chat/editLead`

      3. **Segmentación**: Organice con etiquetas

      4. **Comunicación**: Envíe mensajes personalizados con placeholders

      5. **Seguimiento**: El historial se guarda automáticamente


      **Ideal para**: Ventas, marketing, atención, calificación de leads
  - name: Integración con Chatwoot
    description: >
      **🚧 INTEGRACIÓN BETA - Sistema de integración con Chatwoot para atención
      unificada**


      **⚠️ AVISO**: Esta integración está en fase BETA. Úsela bajo su propio
      riesgo. Recomendamos realizar pruebas en un entorno no productivo antes de
      usarla en producción.


      Esta categoría contiene recursos para configurar y gestionar la
      integración con Chatwoot, una plataforma de atención al cliente
      open-source. La integración permite centralizar las conversaciones de
      WhatsApp en Chatwoot.


      ### Recursos disponibles:

      - 🔧 **Configuración Completa**: Configure URL, tokens y credenciales de
      Chatwoot

      - 📬 **Sincronización Bidireccional**: Los mensajes nuevos entre WhatsApp
      y Chatwoot se sincronizan automáticamente

      - 📱 **Gestión de Contactos**: Sincronización automática de nombres y
      teléfonos

      - 🔄 **Actualización LID→PN**: Migración automática de Local ID a Phone
      Number

      - 🏷️ **Nombres Inteligentes**: Sistema de nombres con tilde (~) para
      actualización automática

      - 🚫 **Separación de Grupos**: Opción para ignorar grupos en la
      sincronización

      - 👤 **Firma de Mensajes**: Identificación del agente en los mensajes
      enviados

      - 🔗 **Webhook Automático**: URL generada automáticamente para configurar
      en Chatwoot


      ### 🏷️ Sistema de Nombres Inteligentes:

      - **Nombres con tilde (~)**: Se actualizan automáticamente cuando el
      contacto modifica su nombre en WhatsApp

      - **Nombres específicos**: Para un nombre fijo, quite la tilde (~) del
      nombre en Chatwoot

      - **Ejemplo**: "~Juan Pérez" = automático, "Juan Pérez" = fijo

      - **Migración LID→PN**: Sin duplicación de conversaciones durante la
      transición

      - **Respuestas nativas**: Aparecen directamente en Chatwoot sin marcas
      externas


      ### ⚠️ Limitaciones conocidas:

      - **Sincronización del historial**: No implementada - solo se sincronizan
      los mensajes nuevos


      ### Casos de uso:

      - Atención centralizada en Chatwoot

      - Equipos de soporte con múltiples agentes

      - Integración con CRM mediante Chatwoot

      - Centralización de canales de comunicación

      - Gestión automática de contactos y nombres


      **Ideal para**: Empresas con equipos de atención, call centers, soporte
      técnico (en entorno de pruebas)


      **Requiere**: Instancia de Chatwoot configurada, tokens de API y entorno
      de pruebas


      **🚧 Recuerde**: Integración en BETA - las funcionalidades pueden cambiar
      sin previo aviso
  - name: Server-Sent Events (SSE)
paths:
  /message/download:
    post:
      tags:
        - Acciones en el mensaje y Búsqueda
      summary: Descargar archivo de un mensaje
      description: >
        Descarga el archivo asociado a un mensaje de medios (imagen, video,
        audio, documento o sticker).


        ## Parámetros


        - **id** (string, obligatorio): ID del mensaje

        - **return_base64** (boolean, default: false): Incluye el archivo en
        base64. Evite esta opción porque aumenta el uso de memoria, el
        procesamiento y el tamaño de la respuesta. Versiones futuras podrán
        limitar base64 para archivos de más de 5 MB.

        - **generate_mp3** (boolean, default: true): Para audios, define el
        formato de retorno
          - `true`: Devuelve MP3
          - `false`: Devuelve OGG
        - **return_link** (boolean, mantenido por compatibilidad): La respuesta
        incluye la URL pública del archivo

        - **transcribe** (boolean, default: false): Transcribe audios a texto

        - **openai_apikey** (string, opcional): Clave de OpenAI para la
        transcripción
          - Si no se informa, usa la clave guardada en la instancia
          - Si se informa, se actualiza y se guarda en la instancia para las próximas llamadas
        - **download_quoted** (boolean, default: false): Descarga los medios del
        mensaje citado
          - Útil para descargar el contenido original de estados de WhatsApp
          - Cuando un mensaje es respuesta a un estado, permite descargar los medios del estado original
          - **Contextualización**: Al descargar los medios citados, usted identifica el contexto de la conversación
            - Ejemplo: Si alguien responde a una promoción, al descargar los medios sabrá que la pregunta es sobre esa promoción específica

        ## Ejemplos


        ### Descargar audio como MP3:

        ```json

        {
          "id": "7EB0F01D7244B421048F0706368376E0",
          "generate_mp3": true
        }

        ```


        ### Transcribir audio:

        ```json

        {
          "id": "7EB0F01D7244B421048F0706368376E0",
          "transcribe": true
        }

        ```


        ### Incluir el contenido en base64:

        ```json

        {
          "id": "7EB0F01D7244B421048F0706368376E0",
          "return_base64": true
        }

        ```


        ### Descargar medios de estado (mensaje citado):

        ```json

        {
          "id": "7EB0F01D7244B421048F0706368376E0",
          "download_quoted": true
        }

        ```

        *Útil cuando el cliente responde a una promoción/estado: usted descarga
        los medios originales para entender sobre qué producto/oferta está
        preguntando.*


        ## Respuesta


        ```json

        {
          "fileURL": "https://api.exemplo.com/files/arquivo.mp3",
          "mimetype": "audio/mpeg",
          "base64Data": "UklGRkj...",
          "transcription": "Texto transcrito"
        }

        ```


        **Nota**:

        - Por defecto, los audios se devuelven como MP3 y todas las descargas
        incluyen una URL pública en `fileURL`.

        - Evite `return_base64: true`: la conversión aumenta el uso de memoria y
        procesamiento en el servidor y produce una respuesta más grande.
        Prefiera descargar el archivo mediante `fileURL`.

        - Compatibilidad futura: el retorno en base64 podrá limitarse para
        archivos de más de 5 MB. No dependa de base64 para archivos grandes.

        - La transcripción requiere una clave de OpenAI válida. La clave puede
        configurarse una vez en la instancia y se reutilizará automáticamente.

        - Retención de medios: el archivo queda disponible en nuestro CDN
        durante 2 días. Después de eso, `fileURL` deja de funcionar. Llame de
        nuevo a este endpoint para generar una nueva URL, mientras el mensaje y
        los medios originales sigan disponibles.

        - Para conservar los medios por más de 2 días, descargue el archivo
        mediante `fileURL` y guárdelo en un almacenamiento propio. Guardar solo
        la URL no amplía el plazo de retención.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: ID del mensaje que contiene el archivo
                  example: 7EB0F01D7244B421048F0706368376E0
                return_base64:
                  type: boolean
                  description: >-
                    Incluye el contenido en base64. Evítelo en archivos grandes;
                    versiones futuras podrán limitar archivos mayores de 5 MB
                  default: false
                generate_mp3:
                  type: boolean
                  description: >-
                    Para audios, define el formato de retorno (true=MP3,
                    false=OGG)
                  default: true
                return_link:
                  type: boolean
                  description: >-
                    Se mantiene por compatibilidad. La URL pública siempre se
                    devuelve en fileURL
                  default: true
                transcribe:
                  type: boolean
                  description: Si es verdadero, transcribe los audios a texto
                  default: false
                openai_apikey:
                  type: string
                  description: Clave de la API de OpenAI para transcripción (opcional)
                  example: sk-...
                download_quoted:
                  type: boolean
                  description: >-
                    Si es verdadero, descarga el contenido multimedia del
                    mensaje citado en lugar del mensaje principal
                  default: false
              required:
                - id
      responses:
        '200':
          description: Descarga de archivo exitosa
          content:
            application/json:
              schema:
                type: object
                properties:
                  fileURL:
                    type: string
                    description: URL pública del archivo, disponible por 2 días
                    example: https://api.exemplo.com/files/arquivo.mp3
                  mimetype:
                    type: string
                    description: Tipo MIME del archivo
                    example: audio/mpeg
                  base64Data:
                    type: string
                    description: Contenido del archivo en base64 (si return_base64=true)
                    example: UklGRkj...
                  transcription:
                    type: string
                    description: Texto transcrito del audio (si transcribe=true)
                    example: Texto transcrito
                required:
                  - mimetype
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: >-
                      Tipo de multimedia no soportado o no se encontró
                      multimedia en el mensaje
        '401':
          description: No autorizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Token inválido
        '404':
          description: No encontrado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    examples:
                      - Message not found
                      - No quoted message found in this message
        '500':
          description: Error interno del servidor
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    example: Error al descargar el contenido multimedia
components:
  securitySchemes:
    token:
      name: token
      type: apiKey
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.