# Descargar Archivo Adjunto

> Descarga archivos adjuntos de Builds de forma programática mediante la API. Genera un token de descarga para un adjunto concreto y resuelve su URL de descarga.

Source: https://docs.applivery.com/es/app-distribution/api/builds/download-attached-file/  •  Last updated: 2026-06-08

**Answers:** ¿Cómo descargo un archivo adjunto de una Build de forma programática? · ¿Qué API se necesita para descargar un archivo adjunto? · ¿Cómo obtengo el fileId de un adjunto? · ¿Qué tipo de token se requiere para generar un token de descarga de adjunto? · ¿Cómo funciona el proceso de descarga de archivos adjuntos? · ¿Qué hacer si el token de descarga ha caducado?

---

**TL;DR:** Descarga archivos adjuntos de las builds de Applivery de forma programática usando la API de Integraciones o la API de Workspace con la autenticación correspondiente.

Descargar un archivo adjunto de una Build de forma programática sigue el mismo **proceso de dos pasos** que descargar el binario de una Build: generar un token de descarga de corta duración y luego usarlo para resolver la URL de descarga real. La diferencia clave es que debes incluir el parámetro de consulta `fileId` para especificar el adjunto que quieres descargar.

:::warning
Este endpoint **solo está disponible a través de la Workspace API** y requiere un **token de una cuenta de servicio** o un token de sesión de usuario obtenido al iniciar sesión. La Integrations API (App API Token) no admite este endpoint.
:::

Para crear un token de una cuenta de servicio, consulta [Cuenta de servicio](https://docs.applivery.com/en/platform/api/service-accounts/).

* * *

## Resumen: flujo de descarga

```
Paso 1: Genera un token de descarga para el archivo adjunto
  GET /v1/organizations/{organizationId}/apps/{applicationId}/builds/{buildId}/downloadToken?fileId={fileId}&type=auto
  → devuelve { token, expiresAt }

Paso 2: Resuelve la URL de descarga
  GET https://download-api.applivery.io/v1/download/{token}
  → redirección HTTP 302 a la URL real del archivo
```

* * *

## Antes de empezar: obtén el fileId

El `fileId` es el `id` de la entrada del adjunto en el array `files` de la Build, donde `type` es igual a `attachment`. Puedes obtenerlo del endpoint de [Detalles de la Build](https://docs.applivery.com/en/app-distribution/api/builds/build-details/).

En la respuesta, busca las entradas del array `files` con `"type": "attachment"`:

```json
{
  "files": [
    {
      "id": "2SWkDbddHBNUaVImZINcZzVN",
      "type": "attachment",
      "file": {
        "originalName": "screenshot.png",
        "mimetype": "image/png",
        "size": 538300,
        "location": "https://storage.cloud.google.com/...",
        "checksum": "b531c0eb..."
      },
      "createdAt": "2024-11-11T11:27:35.446Z",
      "updatedAt": "2024-11-11T11:27:35.446Z"
    }
  ]
}
```

El campo `id` (`2SWkDbddHBNUaVImZINcZzVN` en este ejemplo) es el `fileId` que necesitas para el paso 1.

:::info
Otras entradas del array `files` (con `type: "package"`, `type: "icon"` o `type: "original"`) son archivos internos de la Build, no adjuntos subidos por el usuario. Solo las entradas con `type: "attachment"` son archivos que adjuntaste mediante el endpoint [POST – Archivos adjuntos de una Build](https://docs.applivery.com/en/app-distribution/api/builds/attached-files/).
:::

* * *

**Genera un token de descarga**

Genera un token de corta duración y uso único que autoriza la descarga de un archivo adjunto concreto.

**Endpoint**

```
GET https://api.applivery.io/v1/organizations/{organizationId}/apps/{applicationId}/builds/{buildId}/downloadToken
```

**Autenticación**

```
Authorization: Bearer <your_service_account_token>
```

**Parámetros de ruta**

| Parámetro | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `organizationId` | String | Sí | El identificador único (o slug) de tu organización en Applivery. |
| `applicationId` | String | Sí | El identificador único de la App a la que pertenece la Build. |
| `buildId` | String | Sí | El identificador único de la Build que contiene el adjunto. |

**Parámetros de consulta**

| Parámetro | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `fileId` | String | Sí | El `id` de la entrada del adjunto en el array `files` de la Build (donde `type` es `attachment`). |
| `type` | String | Sí | Establece en `auto` para descargas de archivos adjuntos. |

**Ejemplo de petición**

```bash
curl 'https://api.applivery.io/v1/organizations/ORG_ID/apps/APP_ID/builds/BUILD_ID/downloadToken?fileId=FILE_ID&type=auto' \
  -X GET \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_SERVICE_ACCOUNT_TOKEN'
```

**Respuestas**

**✓ 200 OK**

```json
{
  "status": true,
  "data": {
    "token": "string",
    "expiresAt": "string"
  }
}
```

**✗ 400 Bad Request**

Build aún no procesada. La Build existe pero aún no ha terminado de procesarse. Solo las Builds con `status: processed` pueden generar tokens de descarga.

```json
{
  "status": false,
  "error": {
    "code": 5014,
    "message": "Build Not Processed"
  }
}
```

**✗ 401 Unauthorized**

```json
{
  "status": false,
  "error": {
    "code": 4002,
    "message": "No auth token"
  }
}
```

**✗ 404 Not Found**

```json
{
  "status": false,
  "error": {
    "code": 3001,
    "message": "Entity not found"
  }
}
```

| Campo | Descripción |
| --- | --- |
| `token` | La cadena del token de descarga. Pásalo como parámetro de ruta en el paso 2 para resolver la URL de descarga. |
| `expiresAt` | Timestamp ISO 8601 que indica cuándo caduca el token. Los tokens son de corta duración — úsalos pronto tras generarlos. |

**Resuelve la URL de descarga**

Usa el token obtenido en el paso 1 para obtener la URL de descarga real del archivo. La API responde con una redirección HTTP `302 Found` al almacenamiento del archivo.

:::warning
**No se requiere autenticación**. Este endpoint es público — el propio token actúa como credencial. Cualquier persona con el token puede descargar el archivo, así que trátalo como información sensible y no lo compartas más allá del destinatario previsto.
:::

**Endpoint**

```
GET https://download-api.applivery.io/v1/download/{token}
```

**Parámetros de ruta**

| Parámetro | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `token` | String | Sí | El token de descarga devuelto en el paso 1. |

**Ejemplo de petición**

```bash
curl -L 'https://download-api.applivery.io/v1/download/YOUR_DOWNLOAD_TOKEN' \
  -o downloaded_file.png
```

:::info
El flag `-L` indica a curl que siga la redirección `302` automáticamente. Sin él, recibirás la respuesta de redirección con la cabecera `Location` que contiene la URL real del archivo, pero el archivo no se descargará.
:::

**Respuestas**

**✓ 302 Found**

Redirección a la URL del archivo.
La respuesta no tiene cuerpo. La URL de descarga real está en la cabecera de respuesta `Location`. Sigue la redirección para descargar el archivo.

**✗ 401 Unauthorized**

Token caducado. Los tokens de descarga son de corta duración. Si ha caducado, genera uno nuevo desde el paso 1.

```json
{
  "status": false,
  "error": {
    "code": 4005,
    "message": "Token Expired"
  }
}
```

**✗ 404 Not Found**

```json
{
  "status": false,
  "error": {
    "code": 3001,
    "message": "Entity not found"
  }
}
```

* * *

## Ejemplo completo: descargar un archivo adjunto

```bash
# Paso 1: Genera el token de descarga para el archivo adjunto
TOKEN=$(curl -s \
  'https://api.applivery.io/v1/organizations/ORG_ID/apps/APP_ID/builds/BUILD_ID/downloadToken?fileId=FILE_ID&type=auto' \
  -H 'Authorization: Bearer YOUR_SERVICE_ACCOUNT_TOKEN' \
  | jq -r '.data.token')

# Paso 2: Descarga el archivo siguiendo la redirección
curl -L \
  "https://download-api.applivery.io/v1/download/$TOKEN" \
  -o downloaded_file
```
