---
title: "Large upload, step 1/2: signed staging URL · 0 credits"
method: POST
path: "/api/v1/cases/{caseId}/documents/presign"
tags: ["Cases"]
---

# Large upload, step 1/2: signed staging URL · 0 credits

`POST /api/v1/cases/{caseId}/documents/presign`

## Request

- Base URL: `https://legal.nexusquantum.legal`
- URL: `https://legal.nexusquantum.legal/api/v1/cases/{caseId}/documents/presign`
- Auth: HTTP bearer

Returns { upload_url, object_path, token, expires_at } (TTL 1 h, private staging bucket). The client does a direct PUT to Supabase Storage (bypassing the app server) and then calls …/documents/process (which charges). Limits by type: audio 200 MB · video 500 MB · everything else 50 MB.

## Path parameters

- `caseId` string, uuid, required

## Request body

- object
  - `file_name` string, required
  - `file_type` string: MIME type (e.g. audio/mpeg).
  - `file_size_bytes` integer, required

## Response `200`

{ upload_url, object_path, token, expires_at, next_step }

## Other responses

- `402`: INSUFFICIENT_CREDITS (balance gate; the charge happens in process)
- `413`: FILE_TOO_LARGE

---

[API](https://skmtc.dev/nexusquantum/apis/nexus-legal-api.md) · [All operations](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/revisions/4084d8d4eb0b?raw)
