File uploads from visitors
Let a form on your site take a screenshot or a PDF from the visitor, kept in private storage that only the right people can open. Off until you turn it on.
Turn it on
Ask the assistant, or call set_visitor_uploads (site admins; it always asks you to confirm). The settings:
| Setting | Default | What it does |
|---|---|---|
enabled | off | The switch. Turning it off also stops showing files that were already uploaded. |
max_mb | 5 | Largest file, up to 10 MB. |
allowed_types | PNG, JPEG, GIF, WebP, PDF | Checked from the file's contents, not its name. SVG and HTML files are never accepted. |
per_visitor_hour | 10 | Uploads per visitor per hour. |
per_site_day | 200 | Uploads for the whole site per day. |
view_level | your highest sign-in level | Signed-in visitors at this level or above can open every uploaded file (for example your staff). |
The form and the flow
The form needs enctype="multipart/form-data" and a file field. In its flow, a store_upload step saves the file and gives you its id to keep in a record:
<form method="post" action="/api/flows/report" enctype="multipart/form-data">
<textarea name="body"></textarea>
<input type="file" name="attachment" accept="image/*,application/pdf">
<button>Send</button>
</form>
[{"id": "f", "type": "store_upload", "field": "attachment", "on_fail": {"redirect": "/report?error=file"}},
{"type": "store_record", "collection": "reports", "record_id": "{{random.r}}",
"data": {"body": "{{input.body}}", "file": "{{steps.f.file_id}}", "file_name": "{{steps.f.name}}"}},
{"type": "respond", "redirect": "/thanks"}]
- If the visitor chose no file, the flow goes on without one. Add
"required": trueto insist. - A file that is too big, of the wrong type or over a limit stops the flow with a clear message (or goes to your
on_failpage). - Upload forms must be sent from your own site's pages. A flow can have up to 3 upload steps.
Who can open a file
Link to /api/files/<file id> on your site. The file opens only for:
- the visitor who uploaded it (signed in with the same Studio ID or session),
- signed-in visitors at the site's
view_levelor above, - anyone holding a short-lived signed link that a site admin made with
get_visitor_file_url(10 minutes by default, at most an hour).
Everyone else gets "not found". Files are never public, never listed on your site and never served from /media. Images open in the browser; PDFs download.
Site admins can list files with list_visitor_files and delete one with delete_visitor_file.
Price
As of October 23, 2026: 15.20 credits per 1,000 stored files, plus their size in your site's file storage. Opening a file is an ordinary page request. Current prices are on the Billing page under "What credits pay for".