---
title: "Initiate a resumable upload"
method: POST
path: "/uploads"
tags: ["Uploads"]
---

# Initiate a resumable upload

`POST /uploads`

## Request body

- object
  - `filename` string, required
  - `fileSize` integer, required
  - `contentType` string, required
  - `contentSha256` string — Optional client-computed sha256 of the file bytes (64 lowercase hex chars). When supplied, the platform checks for an existing non-archived sample in the same org with the same hash; on a hit the response carries `existing: true` and the existing `uploadId` instead of minting a new signed URL.

## Response `200`

Resumable upload URL

- UploadCreated
  - `uploadId` string, uuid, required
  - `uploadUrl` string — Resumable upload URL — PUT slide bytes here. Omitted when `existing: true`.
  - `gcsPath` string, required
  - `existing` boolean — True when `contentSha256` matched an existing non-archived sample in the same org. In that case `uploadUrl` is omitted and the byte upload should be skipped.

## Other responses

- `401` — Missing or invalid API key

---

[API](https://skmtc.dev/strandai/apis/strand-ai-platform-api.md) · [All operations](https://skmtc.dev/strandai/apis/strand-ai-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/strandai/strand-ai-platform-api/revisions/811cda19da65/schema)
