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

# Attachments

> Upload files for Connect360 messages and read private attachment assets.

Use attachments when a chat message needs an image, PDF, receipt, or other file.

## Upload Attachments

```text theme={null}
POST /api/v1/connect/attachments
```

The request must be `multipart/form-data`.

## Example

```bash theme={null}
curl "https://api.plato.ae/api/v1/connect/attachments" \
  -X POST \
  -H "Authorization: Bearer $PLATO_API_KEY" \
  -F "files=@receipt.pdf"
```

Upload up to 5 files per request.

Each file can be up to 25 MB.

## Response

```json theme={null}
{
  "files": [
    {
      "id": "file_123",
      "name": "receipt.pdf",
      "s3Key": "workspace/path/receipt.pdf",
      "type": "application/pdf",
      "url": "https://app.plato.ae/api/assets/workspace%2Fpath%2Freceipt.pdf"
    }
  ]
}
```

Store the returned `id` and `s3Key` so the uploaded asset can be associated with the relevant Connect360 workflow.

## Download A Private Attachment

```text theme={null}
GET /api/v1/connect/assets/[...key]
```

Use the `s3Key` returned by the upload response.

```bash theme={null}
curl "https://api.plato.ae/api/v1/connect/assets/workspace/path/receipt.pdf" \
  -H "Authorization: Bearer $PLATO_API_KEY" \
  --output receipt.pdf
```

The API key must belong to the same workspace as the file.

## Permissions

Upload requires:

```text theme={null}
connect360:conversation:engage
```

Download requires either:

```text theme={null}
connect360:conversation:read
```

or:

```text theme={null}
connect360:conversation:engage
```

## Notes

* File names are normalized before upload.
* Uploaded files are stored in a Connect360 folder in Drive.
* The returned URL may point to a private asset route. Keep the API key on the server when fetching private files.
