---
title: "Upload Document"
method: POST
path: "/v1/employer/documents"
tags: ["employer"]
---

# Upload Document

`POST /v1/employer/documents`

## Request

- Base URL: `https://api.vladahealth.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.vladahealth.com/v1/employer/documents`
- Auth: none declared

Upload one contract document (PDF/DOCX, base64). The inline half runs the full fail-closed
lane (size cap -> text extraction, with LOCAL-ONLY OCR for scanned/thin PDF pages when this
host can: tesseract runs on-host, page images never leave the process, and the OCR text is
gate-screened before anything persists -> doc-type detection -> the participant-identifier
gate -> sha dedup -> persist); a rejection returns a typed 4xx with NOTHING persisted. An
accepted document starts its extraction run in the background (poll GET
/documents/status?job_id=). The response and the stored gate_receipt are honest about OCR:
ocr_used always, plus ocr_pages + min_ocr_confidence when OCR ran.

## Cookies

- `vlada_emp_session` string, nullable

## Request body

- DocumentUploadRequest
  - `token` string, nullable
  - `filename` string, required
  - `content_base64` string, required
  - `doc_type` string: auto|tpa_aso|pbm|spd|stop_loss|other
  - `source_label` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/vladahealth/apis/vlada-tools-rest.md) · [All operations](https://skmtc.dev/vladahealth/apis/vlada-tools-rest/llms.txt) · [OpenAPI document](https://skmtc.dev/vladahealth/apis/vlada-tools-rest/revisions/26e5d5a3333c?raw)
