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

# Subida de archivos

> Acepta archivos adjuntos en un formulario - escaneados, almacenados en R2, y descargados desde tu panel - Pro.

<Info>**Pro** - un formulario Free rechaza un envío multipart con archivos adjuntos.</Info>

Formpaste puede aceptar archivos adjuntos en tus formularios. Las subidas
son un POST `multipart/form-data` estándar al mismo endpoint
[`/submit`](/docs/es/quickstart) que ya usas, sin un endpoint de subida separado,
sin necesidad de JavaScript.

## Agregar un input de archivo

### HTML simple (sin JS)

Agrega `enctype="multipart/form-data"` al formulario y un input de archivo:

```html theme={null}
<form action="https://api.formpaste.com/submit" method="POST" enctype="multipart/form-data">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
  <input type="text" name="name" required>
  <input type="email" name="email" required>
  <textarea name="message"></textarea>
  <input type="file" name="attachment" multiple>
  <button type="submit">Send</button>
</form>
```

### React / Vue / Astro / cualquier JS

Construye un `FormData` y envíalo, no establezcas `Content-Type` tú mismo;
el navegador agrega el límite multipart correcto:

```js theme={null}
const form = new FormData();
form.set("access_key", "YOUR_ACCESS_KEY");
form.set("name", name);
form.set("email", email);
for (const file of fileInput.files) form.append("attachment", file);

const res = await fetch("https://api.formpaste.com/submit", {
  method: "POST",
  body: form,
});
```

## Límites

| Límite                                             | Valor         |
| -------------------------------------------------- | ------------- |
| Por archivo                                        | 3.5 MB        |
| Por envío                                          | 3 archivos    |
| Por cuenta (todos los formularios, todo el tiempo) | 5 GB en total |

Un archivo que supere el límite por archivo, o un envío con demasiados
archivos, se rechaza directamente, nada se descarta ni se trunca en
silencio:

| Código                 | HTTP | Significado                                                        |
| ---------------------- | ---- | ------------------------------------------------------------------ |
| `file_too_large`       | 413  | Un archivo subido es demasiado grande.                             |
| `too_many_files`       | 400  | Demasiados archivos en este envío.                                 |
| `empty_file`           | 400  | Un archivo subido estaba vacío.                                    |
| `storage_cap_exceeded` | 413  | Se alcanzó el límite de almacenamiento de archivos de esta cuenta. |

## Qué pasa con un archivo subido

1. El archivo se sube al almacenamiento (Cloudflare R2) y se mantiene
   privado mientras se **escanea**. Nada se libera antes de que termine el
   escaneo, esto es **fail-closed**: si el escaneo no puede confirmar que
   un archivo está limpio, no se pone a disposición.
2. Si el archivo pasa, se vuelve descargable **desde tu panel**, abre el
   envío y descarga el archivo. Las descargas están limitadas al
   propietario: solo la cuenta dueña del formulario puede obtenerlo,
   mediante un enlace autenticado de corta duración. Los archivos nunca
   son accesibles públicamente por URL.
3. Si el archivo falla el escaneo (o es un tipo no seguro o no
   reconocido), se bloquea y nunca se te entrega.

Los archivos nunca se envían por correo como adjuntos, tu correo de
notificación te enlaza al panel para verlos/descargarlos.

**Retención:** un archivo se conserva mientras exista su envío (Pro: 365
días), luego se elimina automáticamente. Eliminar un envío elimina sus
archivos de inmediato.

## Free vs. Pro

Los formularios Free no aceptan subidas de archivos. Enviar una solicitud
multipart con archivos adjuntos contra un formulario del plan Free se
rechaza con:

| Código             | HTTP | Significado                        |
| ------------------ | ---- | ---------------------------------- |
| `upgrade_required` | 403  | Esta función requiere un plan Pro. |

## Sin configuración

No hay ningún interruptor en el panel que activar, cualquier formulario
del plan Pro acepta envíos `multipart/form-data` con campos de archivo tan
pronto como agregues un `<input type="file">` (o adjuntes archivos a un
`FormData`) en tu formulario.
