---
title: "Upload Image File"
method: POST
path: "/upload"
tags: ["Blogs"]
---

# Upload Image File

`POST /upload`

Upload an image file and receive a public URL.

**Request flow:**
- `fileKey` is required by the v1 contract, and its entire value is validated.
- A bare filename defaults to `post_image`; otherwise, the value must start with a supported image prefix. The prefix or default selects the asset bucket/type and required API scope.
- The validated requested object path and filename are not persisted as the stored key. To prevent key collisions and unauthorized overwrites, the server generates the final key as `<bucket>/api-<blogId>/<UUID>`.
- Treat the returned `publicUrl` as the authoritative URL for the uploaded asset.
- Send the raw file bytes as the request body.
- Allowed MIME types: `image/png`, `image/jpeg`, `image/gif`, `image/webp`, `image/x-icon`

**Limits:**
- Maximum file size: 10MB
- Upload rate limiting applies.

## Query parameters

- `fileKey` string, required

## Response `200`

Upload completed successfully

- UploadResponse
  - `publicUrl` string, uri, required — Authoritative `publicUrl` of the uploaded asset

## Other responses

- `400` — Bad request
- `401` — Authentication failed
- `413` — Uploaded file exceeds the 10MB limit
- `429` — Too many upload requests
- `500` — 서버 내부 오류

---

[API](https://skmtc.dev/inblog/apis/inblog-api.md) · [All operations](https://skmtc.dev/inblog/apis/inblog-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/inblog/inblog-api/revisions/445daf773d30/schema)
