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

# Entrega de Productos Digitales

> Entrega archivos descargables, enlaces externos e instrucciones de descarga automáticamente cuando los clientes compran. La Entrega de Productos Digitales es el tipo de derecho de Archivos Digitales. Los archivos se emiten con URLs de descarga pre-firmadas en cada concesión y se revocan cuando se retira el acceso.

## Descripción General

La Entrega de Productos Digitales es el tipo de derecho de **Archivos Digitales**. Cargas tus archivos una vez en un derecho de Archivos Digitales, adjuntas el derecho a un producto, y Dodo Payments entrega enlaces de descarga pre-firmados a cada cliente que paga a través del correo electrónico y el portal del cliente.

El derecho admite:

* **Cargas de archivos alojados**: almacena archivos en Dodo Payments y ofrécelos mediante URLs de corta duración pre-firmadas.
* **Enlaces de descarga externos**: enlaza a archivos alojados en Dropbox, Google Drive, S3 o cualquier URL.
* **Instrucciones de descarga**: texto libre mostrado al cliente en su página de pedido y en el correo electrónico de entrega.

Puedes combinar los tres en un solo derecho.

## Características Clave

<CardGroup cols={2}>
  <Card title="File Upload" icon="upload">
    Sube archivos (PDF, ZIP, imágenes, videos, etc.) de hasta 500 MiB. Los archivos se transmiten y almacenan de manera eficiente.
  </Card>

  <Card title="Multiple Files" icon="files">
    Adjunta tantos archivos como necesites a un solo derecho.
  </Card>

  <Card title="External Links" icon="link">
    Proporciona enlaces de descarga externos (Dropbox, Google Drive, URLs firmadas de S3) como alternativa o adición.
  </Card>

  <Card title="Presigned URLs" icon="lock">
    Los archivos alojados se sirven mediante URLs de corta duración pre-firmadas. Cada URL de descarga expira automáticamente después de aproximadamente 15 minutos.
  </Card>
</CardGroup>

***

## Configurar Entrega de Productos Digitales

<Steps>
  <Step title="Open Entitlements">
    Ve a **Derechos** en tu panel de Dodo Payments y haz clic en **+** para crear un nuevo derecho.
  </Step>

  <Step title="Choose Digital Files">
    Selecciona **Entrega de Productos Digitales** como la integración.
  </Step>

  <Step title="Add files, links, and instructions">
    Configura cualquier combinación de:

    * **Archivos**: carga uno o más archivos. Cada carga devuelve un `file_id` que se agrega al derecho.
    * **URL Externa**: un enlace HTTPS públicamente accesible entregado junto a los archivos alojados.
    * **Instrucciones**: texto libre mostrado al cliente (por ejemplo, "Descomprime y ejecuta setup.sh").

    <Frame>
      <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/digital-files/create.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=33ad03277809d14585d247442c191462" alt="Derecho de Archivos Digitales con campo de carga de archivos, URL externa y campo de instrucciones" style={{ maxHeight: '500px', width: 'auto' }} width="1669" height="989" data-path="images/entitlements/digital-files/create.png" />
    </Frame>
  </Step>

  <Step title="Save the entitlement">
    Guarda. El derecho está ahora disponible para adjuntar a cualquier producto.
  </Step>
</Steps>

## Adjuntar a Productos

Abre un producto, expande **Configuraciones Avanzadas → Derechos y Créditos**, y selecciona tu derecho de Archivos Digitales. El derecho se entrega en cada compra exitosa o suscripción activa vinculada a ese producto.

<Frame caption="Attaching the Digital Files entitlement to a product alongside other entitlements.">
  <img src="https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/attach-to-product.png?fit=max&auto=format&n=do-W-dMDGVB_xzr_&q=85&s=965ad78262791fa8dbb712b4fdf89538" alt="Panel de derechos de producto mostrando la Entrega de Productos Digitales seleccionada" style={{ maxHeight: '500px', width: 'auto' }} width="2000" height="1197" data-path="images/entitlements/attach-to-product.png" />
</Frame>

***

## Cómo Funciona la Entrega

La entrega de Archivos Digitales sigue el estándar [ciclo de vida de la concesión](/features/entitlements/introduction#how-grants-work):

| Evento                                           | Comportamiento                                                                                                                                                                                                          |
| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `payment.succeeded` (una sola vez)               | Emite una concesión. La concesión lleva URLs de descarga pre-firmadas válidas por \~15 minutos; los clientes pueden actualizarlas volviendo a abrir el enlace de correo electrónico o la página del portal del cliente. |
| `subscription.active`                            | Emite una concesión. Los archivos permanecen accesibles mientras la suscripción esté activa.                                                                                                                            |
| `subscription.renewed`                           | No-op. La misma concesión continúa; se generan nuevas URLs pre-firmadas en cada obtención.                                                                                                                              |
| `subscription.on_hold` / `cancelled` / `expired` | Revoca la concesión. No se emiten nuevas URLs pre-firmadas.                                                                                                                                                             |
| `subscription.plan_changed`                      | Revoca la concesión anterior; emite una nueva para el derecho del nuevo plan.                                                                                                                                           |
| `refund.succeeded` (una sola vez)                | Revoca la concesión.                                                                                                                                                                                                    |
| Revocación manual                                | Revoca con `revocation_reason: manual`.                                                                                                                                                                                 |

<Warning>
  La revocación impide que Dodo Payments emita nuevas URLs de descarga, pero **no** invalida las copias que un cliente ya ha descargado. Trata las descargas de archivos alojados como "entregadas una vez leídas."
</Warning>

***

## Experiencia del Cliente

### Confirmación de Compra

Después de una transacción exitosa, el cliente recibe un correo electrónico con enlaces de descarga y cualquier instrucción que hayas configurado.

<Frame>
  <img src="https://mintcdn.com/dodopayments/mOQO5ej_lx0yH9p-/images/digital-product-delivery/2.png?fit=max&auto=format&n=mOQO5ej_lx0yH9p-&q=85&s=54f5247f6d67fe5bb48736682995e23e" alt="Correo de confirmación de compra mostrando enlaces de descarga para productos digitales" style={{ maxHeight: '500px', width: 'auto' }} width="1920" height="1080" data-path="images/digital-product-delivery/2.png" />
</Frame>

### Acceso del Portal del Cliente

Los clientes pueden volver a obtener enlaces de descarga en cualquier momento desde el [Portal del Cliente](/features/customer-portal). La página del portal genera nuevas URLs pre-firmadas bajo demanda, por lo que la misma compra sigue funcionando incluso después de que los enlaces del correo hayan expirado.

<Frame>
  <img src="https://mintcdn.com/dodopayments/mOQO5ej_lx0yH9p-/images/digital-product-delivery/3.png?fit=max&auto=format&n=mOQO5ej_lx0yH9p-&q=85&s=490c6755474c1f00a93f7adde7dabb63" alt="Interfaz del portal del cliente mostrando productos digitales disponibles para descargar" style={{ maxHeight: '500px', width: 'auto' }} width="1920" height="1080" data-path="images/digital-product-delivery/3.png" />
</Frame>

<Check>
  Los clientes pueden descargar archivos directamente desde los correos de confirmación o acceder a ellos en cualquier momento a través de su portal.
</Check>

***

## Gestión de Archivos Programáticamente

### Sube un archivo a un derecho

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  import DodoPayments from 'dodopayments';
  import fs from 'node:fs';

  const client = new DodoPayments({
    bearerToken: process.env['DODO_PAYMENTS_API_KEY'],
    environment: 'test_mode',
  });

  await client.entitlements.files.upload('ent_files_abc', {
    file: fs.createReadStream('./pro-bundle.zip'),
    filename: 'pro-bundle.zip',
  });
  ```

  ```bash cURL theme={null} theme={null}
  curl -X POST "https://test.dodopayments.com/entitlements/ent_files_abc/files" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -F "file=@./pro-bundle.zip" \
    -F "filename=pro-bundle.zip"
  ```
</CodeGroup>

### Lista concesiones y resuelve URLs de descarga

```typescript theme={null} theme={null}
const grants = await client.entitlements.grants.list('ent_files_abc', {
  customer_id: 'cus_abc123',
});

for (const grant of grants.items) {
  for (const file of grant.digital_product_delivery.files) {
    console.log(file.filename, file.download_url, `expires in ${file.expires_in}s`);
  }
}
```

### Elimina un archivo de un derecho

```typescript theme={null} theme={null}
await client.entitlements.files.delete('ent_files_abc', 'df_a4f6c1de');
```

***

## Consideraciones Importantes

* **Las URLs pre-firmadas expiran rápidamente.** Las URLs de descarga devueltas en los payloads de concesión o eventos de webhook son válidas por \~15 minutos. No las almacenes; vuelve a obtenerlas cuando el cliente necesite descargar nuevamente.
* **Actualizar archivos solo afecta futuras compras.** Reemplazar o eliminar un archivo no cambia retroactivamente las descargas ya emitidas. Los clientes anteriores aún pueden volver a obtener la versión que estaba vigente cuando se creó su concesión.
* **Los reembolsos no invalidan las copias descargadas.** Un cliente que ya descargó un archivo conserva esa copia. Para contenido revocable (media con restricción de licencia, acceso limitado en el tiempo), combina Archivos Digitales con [Llaves de Licencia](/features/license-keys) y valida en tiempo de ejecución.
* **Para contenido sensible, prefiere URLs externas con su propia autenticación.** Las URLs pre-firmadas de Dodo Payments son de corta duración pero no autenticadas dentro de su ventana; cualquiera con la URL puede descargar en esa ventana. El contenido alojado externamente y protegido por cuenta ofrece garantías más fuertes.

***

## Gestión de API

<CardGroup cols={2}>
  <Card title="Create Entitlement" icon="plus" href="/api-reference/entitlements/create-entitlement">
    Crea una concesión de Archivos Digitales con URL externa opcional e instrucciones.
  </Card>

  <Card title="Upload File" icon="upload" href="/api-reference/entitlements/upload-file">
    Sube un archivo (de hasta 500 MiB) y anéxalo a la concesión.
  </Card>

  <Card title="Delete File" icon="trash" href="/api-reference/entitlements/delete-file">
    Elimina un archivo de la concesión.
  </Card>

  <Card title="List Grants" icon="users" href="/api-reference/entitlements/list-grants">
    Lista las concesiones y lee las URL de descarga resueltas.
  </Card>

  <Card title="Update Entitlement" icon="pen" href="/api-reference/entitlements/update-entitlement">
    Actualiza las instrucciones, la URL externa o reemplaza archivos.
  </Card>

  <Card title="Revoke Grant" icon="ban" href="/api-reference/entitlements/revoke-grant">
    Revoca manualmente el acceso de un cliente.
  </Card>
</CardGroup>

***

## Webhooks

La entrega y revocación de archivos digitales activan los cuatro [eventos de webhook `entitlement_grant.*`](/developer-resources/webhooks/intents/entitlement-grant). Para las concesiones de Archivos Digitales, el payload incluye un objeto `digital_product_delivery` con la lista de archivos resuelta (URLs pre-firmadas, nombres de archivos, tamaños), el opcional `instructions`, y el opcional `external_url`.

```json theme={null} theme={null}
"digital_product_delivery": {
  "files": [
    {
      "file_id": "df_a4f6c1de",
      "download_url": "https://files.dodopayments.com/.../pro-bundle.zip?Signature=...",
      "filename": "pro-bundle.zip",
      "content_type": "application/zip",
      "file_size": 18742390,
      "expires_in": 900
    }
  ],
  "instructions": "Unzip and run setup.sh from the project root.",
  "external_url": null
}
```

***

## Entrega de Productos Digitales Legado

<Note>
  Los productos configurados con el bloque `digital_product_delivery` en el producto mismo han sido **migrados automáticamente** a un derecho de Archivos Digitales. Los archivos existentes cargados bajo la API de archivo de producto legado se conservan; continúan siendo descargables y aparecen en los payloads de concesiones etiquetados con `source: "legacy"`. Las futuras actualizaciones (agregar archivos, cambiar instrucciones, reemplazar la URL externa) deben hacerse editando el derecho de Archivos Digitales migrado bajo **Derechos**.

  Los campos de producto heredado (`digital_product_delivery.external_url`, `digital_product_delivery.instructions`) continúan siendo poblados en las respuestas de productos para compatibilidad hacia atrás, pero el derecho es la fuente de verdad de aquí en adelante.
</Note>

***

## Mejores Prácticas

* **Trata las descargas como de una sola vez.** Los clientes compartirán o perderán enlaces, así que diseña tu producto asumiendo que cualquier cosa que descarguen es para que ellos la conserven.
* **Usa instrucciones para establecer expectativas.** Para paquetes de varios archivos, agrega una línea `instructions` explicando qué instalar primero o cómo combinar los archivos.
* **Ten en cuenta el límite de 500 MiB.** Los artefactos más grandes (conjuntos de datos multi-GB, cursos de video) deben estar alojados externamente y enlazados vía `external_url` en lugar de subidos.
* **Combínalo con Claves de Licencia para acceso revocable.** Si necesitas revocar el acceso a funciones del producto después de un reembolso, combina la concesión de Archivos Digitales con una concesión de Clave de Licencia y valida la clave en tiempo de ejecución.
* **Prueba el flujo de actualización del portal del cliente.** Confirma que un cliente pueda regresar al portal una semana después y aún obtener un enlace de descarga funcional. Este es el camino principal de recuperación cuando los enlaces de correo electrónico caducan.
