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

# Upload Files

> POST /v1/file-vault/upload

Upload one or more documents into the File Vault. Send the request as
`multipart/form-data`.

## Request

<ParamField body="files" type="file[]" required>
  One or more files. Use repeated `files[]` parts for multiple uploads.
</ParamField>

<ParamField body="folder_id" type="integer">
  Target folder id. Omit to upload to the workspace root. Must be a folder in
  your workspace.
</ParamField>

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.titletrackr.com/v1/file-vault/upload \
    -H "Authorization: Bearer ttr_live_xxx" \
    -F "files[]=@deed.pdf" \
    -F "files[]=@survey.pdf" \
    -F "folder_id=42"
  ```

  ```json Response (201) theme={null}
  {
    "success": true,
    "message": "Files uploaded successfully",
    "files": [
      {
        "id": 9001,
        "filename": "deed.pdf",
        "file_type": "pdf",
        "mime_type": "application/pdf",
        "page_count": 12,
        "file_size": 248133,
        "file_size_human": "242.3 KB",
        "folder_id": 42,
        "is_processing": false,
        "download_url": "https://api.titletrackr.com/v1/file-vault/files/345/download",
        "created_at": "2026-05-29T04:00:00.000000Z"
      }
    ],
    "errors": []
  }
  ```
</CodeGroup>

## Partial failures

Files are validated individually. If some succeed and others fail (e.g. a PDF
over the page limit), the response is still `201` with the successful files in
`files` and per-file reasons in `errors`:

```json theme={null}
{
  "success": true,
  "message": "Some files uploaded successfully, but 1 file(s) failed validation",
  "files": [ /* ... */ ],
  "errors": [
    { "filename": "huge.pdf", "error": "PDF exceeds 500 page limit" }
  ]
}
```
