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

# Upload with an upload URL

> Upload files through a scoped URL without sending a service key.

Upload one or more files to a scoped upload URL created by `GET /presigned-url`.

No service key is required. Send a multipart form body to the returned `uploadUrl`.

<ParamField path="token" type="string" required>
  Upload token from the `uploadUrl`.
</ParamField>

<ParamField body="file" type="file" required>
  File to upload. Multiple files are allowed when the URL was created with `maxFiles` greater than `1`.
</ParamField>

<ParamField body="path" type="string">
  Optional destination folder. If omitted, the upload uses the `path` from the created URL. When provided, it must stay inside the URL path lock.
</ParamField>

<ParamField body="filename" type="string">
  Optional stored filename.
</ParamField>

<ParamField body="metadata" type="object">
  Optional metadata when the URL was created with `allowCustomMetadata=true`.
</ParamField>

```bash theme={null}
curl -X POST "https://api.fivemesh.io/v1/presigned-url/UPLOAD_TOKEN" \
  -F "file=@a.png"
```

If the upload URL was created with `path=screenshots`, this request stores `a.png` under `screenshots/a.png`.

For a single file, the response contains `object`. For multiple files, the response contains `results`.
