---
title: "Upload an image or a TTF/OTF font (multipart)"
method: POST
path: "/assets"
---

# Upload an image or a TTF/OTF font (multipart)

`POST /assets`

## Request

- Base URL: `https://rendry.io/api/v1`
- URL: `https://rendry.io/api/v1/assets`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

The upload door of the web UI and of the stdio MCP server's upload_asset {path}: the file travels as multipart form data, outside any JSON, so a photo never has to be written out as base64. Images PNG, JPEG or WebP up to 5 MB — the content decides the type, not the declared one; fonts TTF or OTF, whose family name comes back as font_family for text layers. Spends an asset slot.

## Headers

- `X-Rendry-Account` string

## Response `201`

Stored

- AssetUploaded: The reply of the multipart POST /assets.
  - `id` string, required
  - `file_name` string, required
  - `url` string, required: Path under /api/v1/files/…, served to the owner only (see Asset.url)
  - `storage_key` string, required
  - `size` integer, required
  - `asset_type` 'image' | 'font', required
  - `font_family` string: Fonts only

## Other responses

- `400`: `error` is a machine code — file_required, file_too_large (with size and limit in MB), unsupported_file_type, file_not_image or invalid_font_file — and `message` the sentence.
- `401`: Missing/invalid credentials
- `403`: Every asset slot is taken: the body is the limit refusal (error, used, limit, freeable, upgrade_url)

---

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