---
title: "POST /v1/uploads"
method: POST
path: "/v1/uploads"
tags: ["Workflows"]
---

# POST /v1/uploads

`POST /v1/uploads`

Issues a presigned S3 upload URL for a file. When `encrypted` is true, a per-upload RSA public key is also returned (SPKI DER, base64) for the client to encrypt to; `workspaceId` is required in that case. The matching private key is wrapped under the workspace data key and stored against the upload, never returned.

## Headers

- `Authorization` string

## Request body

- object
  - `contentType` string, required
  - `filename` string, required
  - `workspaceId` string, uuid
  - `encrypted` boolean

## Response `200`

Default Response

- object
  - `presignedUrl` string, uri, required
  - `expiresIn` number, required
  - `key` string, required
  - `publicKey` string

## Other responses

- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found
- `500` — Internal Server Error

## Changes

- **2026-09-15** `d50a02b79ad3` — 2 info
  - added the optional property `error/code` to the response with the `403` status
  - added the optional property `error/url` to the response with the `403` status

[Change history](https://skmtc.dev/tessl/apis/tessl-api/changes/v1/uploads/post.md)

---

[API](https://skmtc.dev/tessl/apis/tessl-api.md) · [All operations](https://skmtc.dev/tessl/apis/tessl-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tessl/apis/tessl-api/revisions/f5615e00a389?raw)
