---
title: "Start a direct upload (presigned)"
method: POST
path: "/files/init"
tags: ["Files"]
---

# Start a direct upload (presigned)

`POST /files/init`

## Request

- Base URL: `https://api.teamo360.com/api/v1`
- URL: `https://api.teamo360.com/api/v1/files/init`
- Auth: HTTP bearer

Two-phase upload: init returns a presigned PUT URL + token; PUT the bytes; then /files/commit.

Requires the `data:write` token scope.

## Response `200`

Success

## Other responses

- `400`: Malformed parameters or body
- `401`: Missing, invalid, expired, or legacy token
- `403`: Blocked by role, token scope, module grant, or org policy
- `404`: Entity missing or outside the principal’s access
- `429`: Rate limit exceeded - see Retry-After

---

[API](https://skmtc.dev/teamo360/apis/teamo-public-api.md) · [All operations](https://skmtc.dev/teamo360/apis/teamo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/teamo360/apis/teamo-public-api/revisions/32528ecbc4f4?raw)
