Upload DICOM

Create a study, upload DICOM files to presigned URLs, and start AI processing.

Uploading is a three-call flow: create the study, PUT the files to presigned URLs, then start processing. Files go directly to encrypted object storage and never pass through the API servers, so large studies upload fast.

1. Create a study

curl -s -X POST "https://api.vitalview.ai/v1/studies" \
  -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{
    "scan_type": "ct_brain",
    "files": [{"filename": "study.zip", "size_mb": 84.2}],
    "patient": {"name": "DOE^JANE", "dob": "1980-01-01", "sex": "F"},
    "clinical_indication": "Fall with loss of consciousness",
    "vendor_ref": "ACC-2231"
  }'

Response (201):

{
  "study_id": "a1b2c3d4",
  "scan_type": "ct_brain",
  "vendor_ref": "ACC-2231",
  "upload": {
    "s3_prefix": "uploads/<org>/a1b2c3d4",
    "expires_in": 3600,
    "urls": [
      { "filename": "study.zip", "key": "uploads/<org>/a1b2c3d4/study.zip", "url": "https://..." }
    ]
  },
  "created_at": "2026-07-05T09:12:44Z"
}

Request fields:

FieldRequiredNotes
scan_typeyesct_brain, ct_chest, ct_abdomen, ct_whole_body, and other CT body regions
filesyesOne entry per file you will upload; .zip and .dcm only
patientnoname, dob (YYYY-MM-DD), sex (M/F/O); appears on the report draft
clinical_indicationnoFree text shown to the AI planner and on the report
vendor_refnoYour accession or order id, echoed back on every response

Send only the minimum patient demographics your workflow requires. Data is processed under your service agreement.

2. Upload the files

PUT each file to its presigned URL. No API key header, the URL itself carries authorization and expires after one hour.

curl -s -X PUT --upload-file study.zip "$UPLOAD_URL"

Accepted formats:

Single-file uploads support up to 5 GB. If an upload URL expires before you finish, create a new study; creation is free and instant.

3. Start processing

curl -s -X POST "https://api.vitalview.ai/v1/studies/a1b2c3d4/process" \
  -H "X-API-Key: $KEY"

Response (202):

{
  "study_id": "a1b2c3d4",
  "scan_id": "9f8e7d6c5b4a",
  "status": "queued",
  "job_id": "c0ffee...",
  "selected_series": {
    "series_uid": "1.2.840.113619.2.55...",
    "series_description": "AX BRAIN 5.0",
    "file_count": 312,
    "processable": true
  },
  "detected_series": [ ... ]
}

Series selection is automatic: we inspect the upload, list every DICOM series found, and pick the best processable one. If your PACS already knows which series to send, pass it explicitly:

curl -s -X POST ".../studies/a1b2c3d4/process" \
  -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"series_uid": "1.2.840.113619.2.55..."}'

If no series is processable you get 422 no_processable_series with the full detected_series list and per-series reasons.

Calling process twice returns 409 already_processing with the existing scan_id; the study is never dispatched twice.

Next: Retrieve results