---
title: "Upload Chat Image"
method: POST
path: "/api/upload/chat-image"
tags: ["upload", "upload"]
---

# Upload Chat Image

`POST /api/upload/chat-image`

Upload an image pasted/attached into a 1:1 or group call chat.
Returns a 60-minute signed URL; the caller sends a chat message
referencing it. Max file size: 8MB. Supported formats: JPG, PNG, WebP, GIF.

🔒 Used to target the PUBLIC `fluentea-profile-pictures` bucket with
long-cache settings, unlike the DM/channel chat-image path
(chat-image-ephemeral below), which was already migrated to the PRIVATE
30-day-expiry bucket served via short-lived signed URLs. This is the same
exposure for call chat — including school class calls with minors — so a
pasted image was a permanent, unauthenticated, publicly-fetchable URL
forever. Now uploads to the same private bucket and returns a signed URL
in the same `{"success", "url"}` shape the frontend already expects (no
frontend change needed): in-call chat is not persisted server-side (see
reference_incall_chat_not_persisted), so every viewer sees the image
live, well within the 60-minute signed-URL window.

## Headers

- `authorization` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored.md) · [All operations](https://skmtc.dev/fluentea/apis/aurqa-language-learning-platform-refactored/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/fluentea/aurqa-language-learning-platform-refactored/revisions/aea5e6e7d830/schema)
