---
title: "Put a user image (logo, photo) on our address — free"
method: POST
path: "/uploads/image"
tags: ["Landings"]
---

# Put a user image (logo, photo) on our address — free

`POST /uploads/image`

## Request

- Base URL: `https://vibemarketolog.ru/api/agent`
- URL: `https://vibemarketolog.ru/api/agent/uploads/image`
- Auth: HTTP bearer

Downloads a public image by url (SSRF-guarded on the original address and on every redirect, up to 3 redirects, 20 s) or decodes content_base64 (a data: prefix is accepted) and stores it under lk.vibemarketolog.ru/uploads/agent/…. The returned url is permanent: use it in image_input of *-edit models (the logo is kept as is) and directly in <img src> of a landing page — the landing passport accepts it. Only raster PNG, JPG, WEBP, GIF up to 10 MB; the type is detected from the bytes, not from filename. SVG is refused (convert it to PNG). 60 files per day per key, shared with the MCP twin. Files attached by a person in a chat — use POST /uploads/links instead. MCP twin: upload_file.

## Request body

- object: Exactly one source: url or content_base64.
  - `url` string, uri: Public https link to the image, e.g. https://client-site.ru/logo.png
  - `content_base64` string: Image bytes in base64, with or without a data:image/…;base64, prefix
  - `filename` string: logo.png — informational for content_base64; the type is detected from the content

## Response `200`

Stored

- UploadedImage
  - `status` 'ok'
  - `url` string, uri: Permanent address on lk.vibemarketolog.ru
  - `mime` 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif'
  - `bytes` integer
  - `width` integer
  - `height` integer
  - `hint` string

## Other responses

- `401`: Ключ не передан, недействителен, отозван или истёк (missing_token / invalid_token)
- `403`: sandbox_not_allowed (shared trial key from self-registration: its files would be visible to everyone) / insufficient_scope / ip_not_allowed
- `415`: unsupported_type — not PNG/JPG/WEBP/GIF (SVG included); message names the detected type
- `422`: no_source (neither url nor content_base64) / bad_url (not a public address) / fetch_failed (did not download, redirect to a private address) / bad_file (empty, not downloaded or larger than 10 MB) / validation_failed
- `429`: daily_limit (60 files per day per key) / fetch_limit (180 download attempts by url per day per key, failed ones included) / rate_limit_exceeded
- `500`: store_failed — our server could not save the file (logged on our side); retry in a minute

---

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