---
title: "Storage Upload Url"
method: POST
path: "/api/platform/storage/upload-url"
tags: ["platform-sdk"]
---

# Storage Upload Url

`POST /api/platform/storage/upload-url`

## Request

- Base URL: `https://api.tintin-x.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.tintin-x.com/api/platform/storage/upload-url`
- Auth: HTTP bearer

Mint a presigned PUT URL targeting the user's `Apps/<App Title>/`
folder. Quota enforcement runs first — 402 on overflow.

The iframe PUTs the raw bytes to `upload_url`, then calls
`/storage/confirm` to flip the file to `is_confirmed=true`.

## Request body

- StorageUploadUrlRequest: Iframe asks for a presigned PUT against the user's `Apps/<title>/` tree.
  - `filename` string, required
  - `content_type` string, required
  - `size_bytes` integer, required
  - `kind` string, nullable

## Response `201`

Successful Response

- StorageUploadUrlResponse
  - `file_id` string, uuid, required
  - `s3_key` string, required
  - `upload_url` string, required
  - `expires_in_seconds` integer, required

## Other responses

- `422`: Validation Error

---

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