POST
https://api.vaelor.chat/v1/osint/cases/{id}/filesAttaches evidence files to a case. Runs read them alongside public sources. Documents and spreadsheets are parsed to text; images are examined with vision and their embedded metadata (EXIF) is extracted.
Unlike other endpoints, this one takes multipart/form-data.
Body#
filesfile[]RequiredOne or more files, sent as repeated files fields. Up to 20 MiB per upload.
Limits#
| Limit | Value |
|---|---|
| Per upload | 20 MiB |
| Files per case | 50 |
| Total per case | 200 MiB |
Example#
curl https://api.vaelor.chat/v1/osint/cases/a41f9c6e-2b8d-4e17-9f3a-6c0d5e8b2a91/files \
-H "Authorization: Bearer $VAELOR_API_KEY" \
-F "files=@annual-report-2025.pdf" \
-F "files=@storefront.jpg"import { openAsBlob } from 'node:fs'
const form = new FormData()
form.append('files', await openAsBlob('annual-report-2025.pdf'), 'annual-report-2025.pdf')
form.append('files', await openAsBlob('storefront.jpg'), 'storefront.jpg')
const { files } = await fetch(`https://api.vaelor.chat/v1/osint/cases/${caseId}/files`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.VAELOR_API_KEY}` },
body: form
}).then((response) => response.json())files = requests.post(
f"https://api.vaelor.chat/v1/osint/cases/{case_id}/files",
headers={"Authorization": f"Bearer {os.environ['VAELOR_API_KEY']}"},
files=[
("files", open("annual-report-2025.pdf", "rb")),
("files", open("storefront.jpg", "rb")),
],
).json()["files"]Response200
JSON
{
"files": [
{ "id": "9d2e4f10-3c6b-4a8e-b1f7-5e0a2c9d8b63", "name": "annual-report-2025.pdf", "mediaType": "application/pdf", "byteSize": 2841190 },
{ "id": "1b7c3e95-8f4a-4d2b-a6e0-7c9f1d3b5a28", "name": "storefront.jpg", "mediaType": "image/jpeg", "byteSize": 913442 }
]
}Errors#
| Status | When |
|---|---|
400 | No files were sent, or the case file limits would be exceeded. |
404 | The case doesn't exist. |
409 | A run is active. Add files before starting a run, or after it finishes. |
413 | The upload is larger than 20 MiB. |