---
title: "One-time upload page for a person — free"
method: POST
path: "/uploads/links"
tags: ["Landings"]
---

# One-time upload page for a person — free

`POST /uploads/links`

## Request

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

Creates a one-time page lk.vibemarketolog.ru/u/{code} for a person whose files are in a chat (the agent sees them but cannot pass them on). Valid 24 hours, up to 10 files and 150 MB: PNG, JPG, WEBP, GIF up to 10 MB; MP4, MOV, WEBM up to 50 MB; SVG is refused; geotags and camera data are removed. kinds lists what is needed — the page builds the phrase for the person itself ("Нужно для сайта: логотип и фото ваших работ"). Give url to the person (works on a phone, no login), then read the files with GET /uploads/links/{code}. Files never collected are deleted 7 days after the link expires. Documents, card data and passwords are never requested through the link — such a purpose is refused. 30 links per day per account. MCP twin: upload_link (without code).

## Request body

- object
  - `kinds` union: What is needed; an array or a comma-separated string
    - string[]
    - string
  - `purpose` string: Short clarification for the person, e.g. "логотип на прозрачном фоне". No links, phones or e-mails

## Response `200`

Link created: code, url for the person, expires_at, limits

- UploadLink
  - `status` 'ok'
  - `code` string
  - `url` string, uri: Page for the person: lk.vibemarketolog.ru/u/{code}
  - `kinds` string[]
  - `asks` string, nullable: Phrase the page shows to the person
  - `purpose` string, nullable
  - `expires_at` string, date-time, nullable
  - `expires_at_msk` string, nullable
  - `expired` boolean
  - `max_files` integer
  - `count` integer
  - `left` integer
  - `bytes` integer
  - `max_bytes` integer
  - `files` UploadLinkFile[]: Ready files
    - `url` string, uri
    - `mime` string
    - `bytes` integer
    - `width` integer, nullable
    - `height` integer, nullable
    - `name` string: Original name, for showing to the person only
    - `kind` 'image' | 'video'
    - `uploaded_at` string, date-time, nullable
  - `pending` object[]: Videos still being transcoded
    - `name` string
    - `kind` string
    - `uploaded_at` string, nullable
  - `failed` object[]
    - `name` string
    - `message` string
  - `purged_files` integer
  - `accepts` string: Only in the create response
  - `hint` string: What to do next

## 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
- `422`: bad_input — unknown kind, sensitive request (documents, cards, passwords) or a link/phone/e-mail in purpose / validation_failed
- `429`: daily_limit (30 links per day) / busy — a parallel call of the same account is creating a link: wait Retry-After (2 s) and retry / rate_limit_exceeded

---

[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)
