File Uploads Pro
Accept file attachments with your form submissions. Files are uploaded to S3 and replaced with public URLs in your submission data.
Plan limits
| Plan | File Uploads | Max File Size |
|---|---|---|
| Free | Not available | — |
| Pro Pro | Enabled | 10 MB per file |
| Business Business | Enabled | 25 MB per file |
HTML form
Set the form's enctype to multipart/form-data to enable file uploads:
HTML
<form action="https://formfa.st/f/your_endpoint_id"
method="POST"
enctype="multipart/form-data">
<input type="text" name="name" required />
<input type="email" name="email" required />
<label>
Attachment
<input type="file" name="resume" />
</label>
<button type="submit">Submit</button>
</form>JavaScript (FormData)
JavaScript
const form = document.querySelector("#my-form");
const formData = new FormData(form);
const res = await fetch("https://formfa.st/f/your_endpoint_id", {
method: "POST",
headers: { Accept: "application/json" },
body: formData,
// Don't set Content-Type — the browser handles it
});Don't set Content-Type manually
When using
FormData, let the browser set the Content-Type header automatically. It needs to include the multipart boundary.How files are stored
When a file is submitted:
- The file is uploaded to S3 under a unique path:
submissions/{formId}/{uuid}.{ext} - The file field in your submission data is replaced with the public URL
- The URL is included in your notification email and webhook payload
Error handling
If a file exceeds the size limit, the submission is rejected with a 400 error:
JSON
{
"error": "File too large: resume.pdf (max 10 MB)"
}If no S3 bucket is configured (free plan or self-hosted without S3), file fields are silently ignored and the submission is processed without them.