tellmelo.РазработчикамПерейти в tellmelo
Справочный центрПоддержкаПравовая информацияРазработчикам

API

Начало

  • Я хочу …
  • Обзор
  • Быстрый старт
  • Попробовать
  • Твой ключ
  • Что может ключ
  • Боты

Основы

  • Запросы и ответы
  • Страницы
  • Только новое
  • Лимиты
  • Заголовки
  • Когда что-то не работает
  • Версии

Конечные точки

  • Конечные точки
  • Вход
    • GET /
  • Посты
    • GET /posts
    • GET /posts/{id}
    • POST /posts
    • DELETE /posts/{id}
    • GET /me/scheduled
    • POST /posts/{id}/schedule
    • POST /posts/{id}/edit
    • GET /posts/{id}/reply-settings
    • PUT /posts/{id}/reply-settings
    • POST /posts/{id}/coauthor
    • DELETE /posts/{id}/coauthor
    • POST /posts/{id}/pin
  • Ответы
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
    • POST /replies/{id}/edit
    • DELETE /replies/{id}
    • POST /replies/{id}/like
    • POST /replies/{id}/vote
    • POST /replies/{id}/pick
    • GET /posts/{id}/replies/waiting
    • POST /replies/{id}/decide
    • GET /posts/{id}/replies/planned
    • PUT /me/planned-replies/{id}
    • POST /me/planned-replies/{id}/send
    • DELETE /me/planned-replies/{id}
  • Опросы
    • POST /posts/{id}/vote
  • Профили
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
    • GET /profiles/{handle}/events
    • POST /me/events
    • PUT /me/events/{id}
    • DELETE /me/events/{id}
    • GET /me/events/{id}/signups
    • POST /events/{id}/signup
  • Группы
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
    • GET /communities/{id}/members
    • GET /communities/{id}/roles
    • GET /communities/{id}/bell
    • GET /invites/{code}
    • PUT /roles/{id}/self
    • GET /communities/{id}/emojis
    • PUT /communities/{id}/bell
    • POST /invites/{code}/join
    • GET /communities/{id}/bots
  • Каналы
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Управление группами
    • POST /communities/{id}/emojis
    • DELETE /communities/{id}/emojis/{name}
    • POST /communities/{id}/roles
    • PUT /roles/{id}
    • DELETE /roles/{id}
    • PUT /communities/{id}/roles/order
    • PUT /roles/{id}/members/{member}
    • POST /communities/{id}/channels
    • PUT /channels/{id}
    • DELETE /channels/{id}
    • PUT /communities/{id}/channels/order
    • PUT /communities/{id}/channels/shape
    • GET /channels/{id}/overrides
    • PUT /channels/{id}/overrides/{role}
    • POST /communities/{id}/categories
    • PUT /categories/{id}
    • DELETE /categories/{id}
    • PUT /communities/{id}/feed
    • GET /communities/{id}/invites
    • POST /communities/{id}/invites
    • DELETE /invites/{code}
    • POST /channel-messages/{id}/remove
    • POST /communities/{id}/posts/{post}/remove
    • DELETE /communities/{id}/members/{member}
    • PUT /communities/{id}/members/{member}/timeout
    • DELETE /communities/{id}/members/{member}/timeout
    • GET /communities/{id}/bans
    • PUT /communities/{id}/bans/{member}
    • DELETE /communities/{id}/bans/{member}
    • GET /communities/{id}/log
    • POST /communities
    • PUT /communities/{id}
  • Боты
    • GET /events
    • GET /events/stream
    • GET /me/commands
    • PUT /me/commands
    • POST /interactions/{id}/reply
    • POST /channels/{id}/voice
  • Обзор
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF и видео
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Твой аккаунт
    • GET /me
    • GET /feed
    • POST /me/pictures
    • PUT /me/profile
    • GET /me/emojis
    • POST /me/emojis/pictures
    • POST /me/emojis
    • DELETE /me/emojis/{name}
    • PUT /me/emojis/sharing
    • GET /me/webhooks
    • POST /me/webhooks
    • DELETE /me/webhooks/{id}
    • POST /me/webhooks/{id}/test
  • Уведомления
    • GET /notifications
    • POST /notifications/read
  • Сообщения
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
    • DELETE /conversations/{with}/messages/{id}
    • POST /conversations/{with}/planned
    • GET /me/planned-messages
    • POST /me/planned-messages/{id}/send
    • DELETE /me/planned-messages/{id}
  • Связи
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Подборки
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Подарки
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Объекты

  • Объекты
  • Service
  • RateLimit
  • Post
  • Reply
  • ReplyVote
  • PlannedReply
  • ReplySettings
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Membership
  • Person
  • Channel
  • ChannelCategory
  • ChannelSymbol
  • ChannelMessage
  • Role
  • GroupMember
  • ChannelOverride
  • Bell
  • InviteLink
  • InvitePreview
  • InviteGroup
  • Joined
  • LogEntry
  • Ban
  • Until
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • PlannedMessage
  • ScheduledPost
  • Collection
  • Event
  • EventSignups
  • EventSignup
  • Picture
  • EmojiPicture
  • OwnEmoji
  • GroupEmoji
  • BotEvent
  • BotCommand
  • VoiceSeat
  • Webhook
  • WebhookCreated
  • GroupBot
  • VoiceRoom
  • VoicePerson
  • GiftDrop
  • OwnGiftDrop
  • Quota
  • QuotaLook
  • QuotaGift
  • MediaItem
  • Embed
  • UploadStarted
  • UploadPiece
  • Created
  • DropCreated
  • Made
  • Ok

Ещё

  • Машиночитаемое описание
  • GIF и видео на других сайтах
  • Вход через tellmelo
  • Чего мы ждём
Содержание

Начало

  • Я хочу …
  • Обзор
  • Быстрый старт
  • Попробовать
  • Твой ключ
  • Что может ключ
  • Боты

Основы

  • Запросы и ответы
  • Страницы
  • Только новое
  • Лимиты
  • Заголовки
  • Когда что-то не работает
  • Версии

Конечные точки

  • Конечные точки
  • Вход
    • GET /
  • Посты
    • GET /posts
    • GET /posts/{id}
    • POST /posts
    • DELETE /posts/{id}
    • GET /me/scheduled
    • POST /posts/{id}/schedule
    • POST /posts/{id}/edit
    • GET /posts/{id}/reply-settings
    • PUT /posts/{id}/reply-settings
    • POST /posts/{id}/coauthor
    • DELETE /posts/{id}/coauthor
    • POST /posts/{id}/pin
  • Ответы
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
    • POST /replies/{id}/edit
    • DELETE /replies/{id}
    • POST /replies/{id}/like
    • POST /replies/{id}/vote
    • POST /replies/{id}/pick
    • GET /posts/{id}/replies/waiting
    • POST /replies/{id}/decide
    • GET /posts/{id}/replies/planned
    • PUT /me/planned-replies/{id}
    • POST /me/planned-replies/{id}/send
    • DELETE /me/planned-replies/{id}
  • Опросы
    • POST /posts/{id}/vote
  • Профили
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
    • GET /profiles/{handle}/events
    • POST /me/events
    • PUT /me/events/{id}
    • DELETE /me/events/{id}
    • GET /me/events/{id}/signups
    • POST /events/{id}/signup
  • Группы
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
    • GET /communities/{id}/members
    • GET /communities/{id}/roles
    • GET /communities/{id}/bell
    • GET /invites/{code}
    • PUT /roles/{id}/self
    • GET /communities/{id}/emojis
    • PUT /communities/{id}/bell
    • POST /invites/{code}/join
    • GET /communities/{id}/bots
  • Каналы
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Управление группами
    • POST /communities/{id}/emojis
    • DELETE /communities/{id}/emojis/{name}
    • POST /communities/{id}/roles
    • PUT /roles/{id}
    • DELETE /roles/{id}
    • PUT /communities/{id}/roles/order
    • PUT /roles/{id}/members/{member}
    • POST /communities/{id}/channels
    • PUT /channels/{id}
    • DELETE /channels/{id}
    • PUT /communities/{id}/channels/order
    • PUT /communities/{id}/channels/shape
    • GET /channels/{id}/overrides
    • PUT /channels/{id}/overrides/{role}
    • POST /communities/{id}/categories
    • PUT /categories/{id}
    • DELETE /categories/{id}
    • PUT /communities/{id}/feed
    • GET /communities/{id}/invites
    • POST /communities/{id}/invites
    • DELETE /invites/{code}
    • POST /channel-messages/{id}/remove
    • POST /communities/{id}/posts/{post}/remove
    • DELETE /communities/{id}/members/{member}
    • PUT /communities/{id}/members/{member}/timeout
    • DELETE /communities/{id}/members/{member}/timeout
    • GET /communities/{id}/bans
    • PUT /communities/{id}/bans/{member}
    • DELETE /communities/{id}/bans/{member}
    • GET /communities/{id}/log
    • POST /communities
    • PUT /communities/{id}
  • Боты
    • GET /events
    • GET /events/stream
    • GET /me/commands
    • PUT /me/commands
    • POST /interactions/{id}/reply
    • POST /channels/{id}/voice
  • Обзор
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF и видео
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Твой аккаунт
    • GET /me
    • GET /feed
    • POST /me/pictures
    • PUT /me/profile
    • GET /me/emojis
    • POST /me/emojis/pictures
    • POST /me/emojis
    • DELETE /me/emojis/{name}
    • PUT /me/emojis/sharing
    • GET /me/webhooks
    • POST /me/webhooks
    • DELETE /me/webhooks/{id}
    • POST /me/webhooks/{id}/test
  • Уведомления
    • GET /notifications
    • POST /notifications/read
  • Сообщения
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
    • DELETE /conversations/{with}/messages/{id}
    • POST /conversations/{with}/planned
    • GET /me/planned-messages
    • POST /me/planned-messages/{id}/send
    • DELETE /me/planned-messages/{id}
  • Связи
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Подборки
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Подарки
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Объекты

  • Объекты
  • Service
  • RateLimit
  • Post
  • Reply
  • ReplyVote
  • PlannedReply
  • ReplySettings
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Membership
  • Person
  • Channel
  • ChannelCategory
  • ChannelSymbol
  • ChannelMessage
  • Role
  • GroupMember
  • ChannelOverride
  • Bell
  • InviteLink
  • InvitePreview
  • InviteGroup
  • Joined
  • LogEntry
  • Ban
  • Until
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • PlannedMessage
  • ScheduledPost
  • Collection
  • Event
  • EventSignups
  • EventSignup
  • Picture
  • EmojiPicture
  • OwnEmoji
  • GroupEmoji
  • BotEvent
  • BotCommand
  • VoiceSeat
  • Webhook
  • WebhookCreated
  • GroupBot
  • VoiceRoom
  • VoicePerson
  • GiftDrop
  • OwnGiftDrop
  • Quota
  • QuotaLook
  • QuotaGift
  • MediaItem
  • Embed
  • UploadStarted
  • UploadPiece
  • Created
  • DropCreated
  • Made
  • Ok

Ещё

  • Машиночитаемое описание
  • GIF и видео на других сайтах
  • Вход через tellmelo
  • Чего мы ждём

Я хочу …

Выбери, что задумал; ниже только нужные для этого шаги. Полный справочник — дальше внизу.

  1. Создай бота в одной из своих групп, в меню группы в разделе «Боты → Мои боты», с картинкой, именем и @именем. Его токен ты увидишь только один раз.
  2. Поделись его ссылкой «Добавить бота» или отправь его в каталог ботов, где он появится после проверки командой; тот, кто может управлять ролями в группе, принимает его с правами, на которые соглашается.
  3. Получай события его групп потоком (GET /v2/events/stream) или на свой адрес и пиши через POST /v2/channels/{id}/messages. Подробнее в Боты.
  4. Зарегистрируй команды (PUT /v2/me/commands) и отвечай карточками и кнопками; музыку бот играет с местом в голосовом канале (POST /v2/channels/{id}/voice).

Обзор

v2 позволяет твоим собственным программам общаться с tellmelo: один ключ на запрос, в ответ JSON, все списки листаются одинаково. Действуют те же правила, что и в приложении.

  • Каждый путь начинается с https://api.tellmelo.com/v2.
  • Запросы и ответы — JSON в UTF-8. Имена полей, коды и значения английские и остаются английскими.
  • Ключ действует как твой аккаунт: чего ты не видишь в приложении, он тоже не прочитает.
https://api.tellmelo.com/v2

Быстрый старт

  1. Создай ключ в «Раздел для разработчиков → API» и скопируй его. Он показывается только один раз.
  2. Вызови с ним корень. В ответе — версия, права ключа и сколько запросов осталось в этой минуте.
  3. Все пути работают одинаково: ключ в заголовке, в ответ JSON, для списков items и next.
curl -H "Authorization: Bearer tm_key_…" https://api.tellmelo.com/v2
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

Дальше: /me для твоего профиля, /posts для публичных постов, /feed для твоей ленты.

Попробовать

Выбери задачу, заполни поля и скопируй запрос или отправь его отсюда. Перед записью мы спросим. Код читает ключ из TELLMELO_KEY.

read Версия API и название этого сервера.

curl \
  -H "Authorization: Bearer $TELLMELO_KEY" \
  "https://api.tellmelo.com/v2"

Твой ключ

До 10 ключей на аккаунт, у каждого имя, свои права и при желании срок действия. Ключ начинается с tm_key_ и показывается только один раз. Потерял? Обнови его, старое значение перестанет работать.

Ты создаёшь его в «Раздел для разработчиков → API». Он передаётся в заголовке запроса:

curl -H "Authorization: Bearer tm_key_…" \
  https://api.tellmelo.com/v2/posts

Или, если так удобнее, в отдельном заголовке:

curl -H "X-Tellmelo-Key: tm_key_…" https://api.tellmelo.com/v2

Не в URL: он попал бы в логи и в историю браузера.

Тот же ключ загружает изображения: каждый url ведёт на /api/media; передавай ключ в заголовке и там.

curl -H "Authorization: Bearer tm_key_…" \
  -o picture.webp "https://api.tellmelo.com/media?id=…"

Что может ключ

Ключ всегда может читать, а если ты разрешишь, ещё писать, дарить, загружать медиа и управлять группами. У каждого пути ниже указано, что ему нужно:

  • read: чтение. Публичные публикации, профили, группы и теги, а также твоя лента, уведомления, сообщения и каналы твоих групп.
  • write: действия. Публиковать, отвечать, голосовать, отправлять сообщения, писать в чате группы, подписываться, вступать, блокировать, отмечать уведомления прочитанными.
  • gifts: дарить. Из квоты партнёра участнику и подарки под новым постом. Отдельное право, чтобы ключ для публикаций никогда ничего не мог раздать.
  • media: своя медиатека. Загрузка, изменение, публикация и удаление GIF и видео. Отдельное право, потому что загрузки расходуют видеобаллы аккаунта. Для поиска общих GIF и видео достаточно read.
  • groups: управлять группами. Роли, каналы, категории, пригласительные ссылки, канал ленты, удаления, заглушения, исключения и баны — насколько твой аккаунт это может в группе. Отдельное право, чтобы ключ для публикаций никогда не менял, кто что может в группе.

Чего не может ни один ключ

Ни один ключ не достаёт до пароля, адреса эл. почты, типа аккаунта, места, роли, удаления, сеансов, push-устройств и других ключей, а также до администрирования и руководства группами. Что защищает пароль, ни один ключ не может.

Боты

Бот — это отдельный аккаунт вида bot для групп: без пароля и почты, им управляет твоя программа с собственным ключом. Он использует тот же API, что и любой аккаунт, и может в группах всё, что разрешает его роль там.

  1. В одной из своих групп открой меню группы и в разделе «Боты → Мои боты» создай бота с картинкой, обложкой, именем, именем пользователя и описанием. Токен показывается только один раз; у него права read, write, media и groups.
  2. Поделись ссылкой на бота или отправь его в каталог ботов; он появится там, как только команда его проверит. Тот, кто может управлять ролями в группе, выбирает права; бот вступает и получает собственную роль.
  3. Твоя программа отправляет токен как Authorization: Bearer …, читает события своих групп потоком и работает с маршрутами из разделов Боты, Каналы и Группы.

Небольшой бот, который читает события потоком и отвечает на команду /ping словом pong только спросившему:

// Node 18 or newer: reads the events of the bot's groups as they happen and answers /ping.
const BASE = 'https://api.tellmelo.com/v2';
const KEY = process.env.TELLMELO_BOT_TOKEN;
const call = (method, path, body) =>
  fetch(BASE + path, {
    method,
    headers: { Authorization: 'Bearer ' + KEY, 'Content-Type': 'application/json' },
    body: body && JSON.stringify(body),
  }).then((r) => r.json());

await call('PUT', '/me/commands', { commands: [{ name: 'ping', description: 'Answers pong' }] });

let last = '';
for (;;) {
  // The stream closes after ten minutes; Last-Event-ID goes on where it stopped.
  const res = await fetch(BASE + '/events/stream', {
    headers: { Authorization: 'Bearer ' + KEY, ...(last && { 'Last-Event-ID': last }) },
  });
  const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();
  let buffer = '';
  for (;;) {
    const { value, done } = await reader.read();
    if (done) break;
    buffer += value;
    let end;
    while ((end = buffer.indexOf('

')) >= 0) {
      const data = buffer.slice(0, end).split('
').find((l) => l.startsWith('data: '));
      buffer = buffer.slice(end + 2);
      if (!data) continue;
      const event = JSON.parse(data.slice(6));
      last = event.id;
      if (event.type === 'command' && event.data.command === 'ping')
        await call('POST', '/interactions/' + event.data.interaction + '/reply', { text: 'pong', private: true });
    }
  }
}

Тот же бот на Python, получающий события постранично:

# Python 3 with requests: the same bot, reading the events page by page.
import os, time, requests

BASE = 'https://api.tellmelo.com/v2'
H = {'Authorization': 'Bearer ' + os.environ['TELLMELO_BOT_TOKEN']}
requests.put(BASE + '/me/commands', headers=H,
             json={'commands': [{'name': 'ping', 'description': 'Answers pong'}]})

since = '0'
while True:
    page = requests.get(BASE + '/events', headers=H, params={'since': since}).json()
    for event in page['items']:
        if event['type'] == 'command' and event['data']['command'] == 'ping':
            requests.post(f"{BASE}/interactions/{event['data']['interaction']}/reply",
                          headers=H, json={'text': 'pong'})
    since = page['next'] or since
    time.sleep(2)
  • Что бот может делать в группе, определяет его роль там, а не токен. Роль носит его имя; группа меняет её права в ролях в настройках группы и удаляет бота в меню группы в разделе «Боты → В этой группе».
  • До 5 ботов на аккаунт; в группе — столько, сколько позволяют её бонусы. Бот пишет не больше 30 сообщений в минуту в одной группе, не находится через поиск и пишет только тем, кто написал ему первым. Действуют ограничения.
  • События приходят и на собственный HTTPS-адрес (с подписью, как вебхуки, и повторами). Кроме того: команды (PUT /v2/me/commands) с ответами для всех или только спросившему, карточки и кнопки в сообщениях и музыка в голосовых каналах (POST /v2/channels/{id}/voice): всё в разделе Боты.

Запросы и ответы

  • JSON везде. Каждый ответ — application/json в UTF-8, включая ошибки. Только изображения приходят изображениями.
  • Что ты отправляешь. POST передаёт свои поля как JSON в теле. Если поле есть и в URL, побеждает тело.
  • Время — миллисекунды с 1 января 1970 года, UTC.
  • ID — строки. Сравнивай их только целиком.
  • Каждое поле присутствует всегда. Отсутствующее — null; списки могут быть пустыми.
  • Тексты — обычный текст, ровно как написаны. #теги, @имена и ссылки остаются как есть, как и собственные эмодзи сервера в виде :имя:; их картинки перечислены в /emojis.
  • Изображения — относительные адреса, /api/media?id=…. Без ключа в заголовке получишь 401.

Страницы

Каждый список принимает limit и cursor и отвечает items и next. Отправь next обратно как cursor, чтобы получить следующую страницу; если next пуст, всё. Курсор непрозрачен: не разбирай его и не составляй сам.

{ "items": [ … ], "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx" }

curl -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts?limit=20&cursor=MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"

Без limit — 20 записей, максимум 50. Некоторые списки не листаются; их next всегда null.

Только новое

Каждый ответ несёт ETag. Отправь его в следующий раз как If-None-Match: если ничего не изменилось, получишь 304 без тела.

ETag: W/"3Qk1mJ7fQe2Yb0sVxT9aL4pNdRc"
If-None-Match: W/"3Qk1mJ7fQe2Yb0sVxT9aL4pNdRc"  →  304

Исключения: у /feed нет ETag, потому что его порядок всё время меняется, а записи никогда не отвечают 304.

Лимиты

Ключ может делать 120 запросов в минуту, 600 с тарифом «Организация», если администрация не задала иначе. Сверх этого ты получишь 429, и ничего не выполнится. Подожди минуту и отправь запрос снова.

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1758624060

Записи также учитываются в лимитах приложения, например сколько постов за несколько минут. Это тоже отвечает 429 с rate_limited.

Заголовки

Кроме ключа, никакие заголовки не обязательны.

Что ты отправляешь

ЗаголовокЗначение
AuthorizationНесёт ключ: Bearer tm_key_…. Обычный способ.
X-Tellmelo-KeyКлюч, как альтернатива Authorization.
Content-Typeapplication/json, для запроса с телом.
If-None-MatchETag последнего ответа. Если с тех пор ничего не изменилось, ответ — 304 без тела.

Что приходит в ответ

ЗаголовокЗначение
ETagОтпечаток этого ответа (W/). Отправь его обратно как If-None-Match.
X-RateLimit-LimitСколько запросов в минуту может делать этот ключ.
X-RateLimit-RemainingСколько из них осталось в текущей минуте.
X-RateLimit-ResetКогда начнётся следующая минута, в секундах с 1970 года, UTC.
X-Tellmelo-ScopeЧто может этот ключ: read или read write.
Retry-AfterПри 429: сколько секунд подождать перед новым запросом.
WWW-AuthenticateПри 401 без ключа: Bearer.
Cache-Controlno-store: ни один прокси не может кэшировать ответ. Проверить его ты всё равно можешь по ETag.

Когда что-то не работает

Ошибки приходят в JSON: фиксированный английский код в error для программы и фраза в message для людей, плюс соответствующий код статуса. Сравнивай только код; фраза может меняться.

{ "error": "rate_limited",
  "message": "Too many requests. Try again in a minute.",
  "limit": 120 }

Некоторые ошибки несут ещё одно поле: docs при 401 из-за отсутствия ключа, limit при 429.

СтатусКодЗначение
400bad_requestЗапрос нельзя прочитать, не хватает обязательного поля или значение недопустимо.
401key_missingВ заголовке нет ключа.
401key_invalidКлюч недействителен: опечатка, замена или аккаунт заблокирован.
401unauthorizedОтклонено как без входа, по причине, не связанной с ключом.
403scope_missingУ ключа нет нужного права, обычно write.
403account_data_lockedДанные аккаунта, такие как пароль, адрес эл. почты или удаление, ключам недоступны.
403forbiddenТвоему аккаунту это нельзя, например из-за отозванного права или блокировки.
403timed_outЗаглушение сейчас не даёт твоему аккаунту писать в этой группе.
404unknown_pathТакого пути нет или нет с этим методом.
404not_foundНе найдено, или тебе нельзя это видеть.
409conflictКонфликтует с уже существующим, например имя занято.
409feed_offКанал ленты этой группы выключен.
413too_largeСлишком велико для этого сервера.
422unprocessableЧитается, но в таком виде невозможно.
429rate_limitedСлишком много запросов. Ничего не произошло; подожди и попробуй снова.
500internal_errorНа сервере что-то пошло не так.

Версии

Версия указана в пути. Пока там v2, пути и поля остаются прежними; новое только добавляется.

Дополнения увеличивают второе число. У каждого пути указано, с какой версии он есть.

2.20
PUT /v2/roles/{id}/selfGET /v2/eventsGET /v2/events/streamGET /v2/me/commandsPUT /v2/me/commandsPOST /v2/interactions/{id}/replyGET /v2/communities/{id}/emojisPOST /v2/communities/{id}/emojisDELETE /v2/communities/{id}/emojis/{name}PUT /v2/communities/{id}/channels/shapePOST /v2/channels/{id}/voice
2.19
POST /v2/replies/{id}/votePOST /v2/replies/{id}/pickGET /v2/posts/{id}/replies/waitingPOST /v2/replies/{id}/decideGET /v2/posts/{id}/replies/plannedPUT /v2/me/planned-replies/{id}POST /v2/me/planned-replies/{id}/sendDELETE /v2/me/planned-replies/{id}GET /v2/posts/{id}/reply-settingsPUT /v2/posts/{id}/reply-settingsPOST /v2/posts/{id}/coauthorDELETE /v2/posts/{id}/coauthorPOST /v2/posts/{id}/pinPOST /v2/conversations/{with}/plannedGET /v2/me/planned-messagesPOST /v2/me/planned-messages/{id}/sendDELETE /v2/me/planned-messages/{id}GET /v2/profiles/{handle}/followersGET /v2/profiles/{handle}/followingGET /v2/me/relationsGET /v2/me/collectionsPOST /v2/me/collectionsPUT /v2/me/collections/{id}DELETE /v2/me/collections/{id}GET /v2/me/collections/{id}/postsPOST /v2/me/collections/{id}/postsGET /v2/profiles/{handle}/eventsPOST /v2/me/eventsPUT /v2/me/events/{id}DELETE /v2/me/events/{id}GET /v2/me/events/{id}/signupsPOST /v2/events/{id}/signupPOST /v2/me/picturesPUT /v2/me/profileGET /v2/me/emojisPOST /v2/me/emojis/picturesPOST /v2/me/emojisDELETE /v2/me/emojis/{name}PUT /v2/me/emojis/sharingGET /v2/me/webhooksPOST /v2/me/webhooksDELETE /v2/me/webhooks/{id}POST /v2/me/webhooks/{id}/testPOST /v2/communitiesPUT /v2/communities/{id}GET /v2/communities/{id}/botsGET /v2/communities/{id}/voice
2.16
PUT /v2/communities/{id}/members/{member}/timeoutDELETE /v2/communities/{id}/members/{member}/timeoutGET /v2/communities/{id}/bansPUT /v2/communities/{id}/bans/{member}DELETE /v2/communities/{id}/bans/{member}
2.15
GET /v2/communities/{id}/channelsGET /v2/channels/{id}/messagesGET /v2/communities/{id}/membersGET /v2/communities/{id}/rolesGET /v2/communities/{id}/bellGET /v2/invites/{code}POST /v2/channels/{id}/messagesPOST /v2/channels/{id}/readDELETE /v2/channel-messages/{id}PUT /v2/communities/{id}/bellPOST /v2/invites/{code}/joinPOST /v2/communities/{id}/rolesPUT /v2/roles/{id}DELETE /v2/roles/{id}PUT /v2/communities/{id}/roles/orderPUT /v2/roles/{id}/members/{member}POST /v2/communities/{id}/channelsPUT /v2/channels/{id}DELETE /v2/channels/{id}PUT /v2/communities/{id}/channels/orderGET /v2/channels/{id}/overridesPUT /v2/channels/{id}/overrides/{role}POST /v2/communities/{id}/categoriesPUT /v2/categories/{id}DELETE /v2/categories/{id}PUT /v2/communities/{id}/feedGET /v2/communities/{id}/invitesPOST /v2/communities/{id}/invitesDELETE /v2/invites/{code}POST /v2/channel-messages/{id}/removePOST /v2/communities/{id}/posts/{post}/removeDELETE /v2/communities/{id}/members/{member}GET /v2/communities/{id}/log
2.14
GET /v2/mediaGET /v2/media/mineGET /v2/media/{id}POST /v2/media/uploadsPUT /v2/media/uploads/{upload}POST /v2/media/{id}DELETE /v2/media/{id}
2.12
GET /v2/me/scheduledPOST /v2/posts/{id}/schedulePOST /v2/posts/{id}/editPOST /v2/replies/{id}/editDELETE /v2/replies/{id}POST /v2/replies/{id}/likeDELETE /v2/conversations/{with}/messages/{id}GET /v2/partner/quotaGET /v2/partner/giftsPOST /v2/partner/giftsGET /v2/gift-dropsPOST /v2/gift-drops
2.1
GET /v2/emojisPOST /v2/conversations/{with}/read
2.0
GET /v2GET /v2/postsGET /v2/posts/{id}GET /v2/posts/{id}/repliesGET /v2/profiles/{handle}GET /v2/profiles/{handle}/postsGET /v2/communitiesGET /v2/communities/{id}GET /v2/communities/{id}/postsGET /v2/tagsGET /v2/searchGET /v2/meGET /v2/feedGET /v2/notificationsGET /v2/conversationsGET /v2/conversations/{with}/messagesPOST /v2/postsDELETE /v2/posts/{id}POST /v2/posts/{id}/repliesPOST /v2/posts/{id}/votePOST /v2/relationsPOST /v2/conversations/{with}/messagesPOST /v2/notifications/read

https://api.tellmelo.com/v1/ больше нет: старые пути отвечают 410 и называют новый путь в теле.

Конечные точки

Все пути одним взглядом, затем каждый с примером.

ПутьПравоДля чего
Вход
GET/v2readВерсия API и название этого сервера.
Посты
GET/v2/postsreadПубличные посты, сначала новые.
GET/v2/posts/{id}readОдин пост по его id.
POST/v2/postswriteОпубликовать пост.
DELETE/v2/posts/{id}writeУдалить один из своих постов.
GET/v2/me/scheduledreadТвои посты, которые ещё не вышли, и чего они ждут.
POST/v2/posts/{id}/schedulewriteИзменить, когда выйдет запланированный пост или когда пост удалится сам.
POST/v2/posts/{id}/editwriteИзменить текст своего поста.
GET/v2/posts/{id}/reply-settingsreadКто может отвечать на твой пост, ждут ли ответы одобрения и медленный режим.
PUT/v2/posts/{id}/reply-settingswriteИзменить настройки ответов своего поста. То, что не указано, остаётся как есть.
POST/v2/posts/{id}/coauthorwriteПринять или отклонить приглашение стать соавтором.
DELETE/v2/posts/{id}/coauthorwriteВыйти из соавторов или, как автор, убрать соавтора с поста.
POST/v2/posts/{id}/pinwriteЗакрепить свой пост вверху профиля или открепить его.
Ответы
GET/v2/posts/{id}/repliesreadОтветы на пост, без заблокированных аккаунтов.
POST/v2/posts/{id}/replieswriteОтветить на пост.
POST/v2/replies/{id}/editwriteИзменить текст своего ответа.
DELETE/v2/replies/{id}writeУдалить свой ответ.
POST/v2/replies/{id}/likewriteПроголосовать «за» ответ (с тех пор как ответы оценивают голосами, отметка «нравится» — это голос «за») или отозвать голос; голос «против» остаётся.
POST/v2/replies/{id}/votewriteПроголосовать за ответ или против него либо отозвать свой голос. Возвращает твой голос и итоговый рейтинг.
POST/v2/replies/{id}/pickwriteОтметить ответ под своим постом как лучший или снять отметку.
GET/v2/posts/{id}/replies/waitingreadОтветы под постом, ожидающие одобрения: под твоим — все, иначе только твои.
POST/v2/replies/{id}/decidewriteОдобрить или отклонить ожидающий ответ под своим постом. Отклонённый удаляется.
GET/v2/posts/{id}/replies/plannedreadТвои ответы под постом, запланированные на потом.
PUT/v2/me/planned-replies/{id}writeИзменить текст или время запланированного ответа. Неудавшийся снова ждёт.
POST/v2/me/planned-replies/{id}/sendwriteОтправить запланированный ответ сразу.
DELETE/v2/me/planned-replies/{id}writeУдалить запланированный ответ.
Опросы
POST/v2/posts/{id}/votewriteПринять участие в опросе.
Профили
GET/v2/profiles/{handle}readПрофиль по его короткому имени.
GET/v2/profiles/{handle}/postsreadПубличные посты одного профиля, сначала новые.
GET/v2/profiles/{handle}/eventsreadПредстоящие события профиля, ближайшие сначала.
POST/v2/me/eventswriteСоздать событие. Возвращает его id.
PUT/v2/me/events/{id}writeИзменить своё событие. Все поля задаются заново.
DELETE/v2/me/events/{id}writeУдалить своё событие.
GET/v2/me/events/{id}/signupsreadКто записался на твоё событие.
POST/v2/events/{id}/signupwriteЗаписаться на событие или отменить запись.
Группы
GET/v2/communitiesreadОткрытые группы этого сервера; с mine=true — группы твоего аккаунта.
GET/v2/communities/{id}readОдна группа по её id.
GET/v2/communities/{id}/postsreadПубликации канала ленты группы, сначала новые.
GET/v2/communities/{id}/membersreadУчастники группы с их ролями.
GET/v2/communities/{id}/rolesreadРоли группы, сначала высшая, @everyone последней.
GET/v2/communities/{id}/bellreadКакие уведомления присылает тебе группа.
GET/v2/invites/{code}readГруппа за ссылкой-приглашением, до вступления.
PUT/v2/roles/{id}/selfwriteВзять или снять роль на выбор.
GET/v2/communities/{id}/emojisreadСобственные эмодзи группы.
PUT/v2/communities/{id}/bellwriteНастроить, какие уведомления присылает тебе группа.
POST/v2/invites/{code}/joinwriteВступить в группу по ссылке-приглашению.
GET/v2/communities/{id}/botsreadБоты группы и то, что разрешает их роль.
Каналы
GET/v2/communities/{id}/channelsreadКаналы группы, которые ты видишь, по порядку.
GET/v2/channels/{id}/messagesreadСообщения чат-канала, сначала новые.
POST/v2/channels/{id}/messageswriteНаписать сообщение в чат-канал.
POST/v2/channels/{id}/readwriteОтметить чат-канал прочитанным до момента времени.
DELETE/v2/channel-messages/{id}writeУдалить своё сообщение в чат-канале.
GET/v2/communities/{id}/voicereadКто сейчас в голосовых каналах группы, по каналам.
Управление группами
POST/v2/communities/{id}/emojisgroupsДобавить эмодзи группе.
DELETE/v2/communities/{id}/emojis/{name}groupsУдалить эмодзи из группы.
POST/v2/communities/{id}/rolesgroupsСоздать роль.
PUT/v2/roles/{id}groupsИзменить название, цвет и права роли.
DELETE/v2/roles/{id}groupsУдалить роль.
PUT/v2/communities/{id}/roles/ordergroupsЗадать порядок ролей.
PUT/v2/roles/{id}/members/{member}groupsВыдать участнику роль или забрать её.
POST/v2/communities/{id}/channelsgroupsСоздать чат-канал.
PUT/v2/channels/{id}groupsИзменить название, тему и категорию канала.
DELETE/v2/channels/{id}groupsУдалить чат-канал вместе с сообщениями.
PUT/v2/communities/{id}/channels/ordergroupsЗадать порядок категорий и чат-каналов.
PUT/v2/communities/{id}/channels/shapegroupsЗадать форму всех символов каналов группы.
GET/v2/channels/{id}/overridesgroupsЧто роли могут в канале иначе, чем в группе.
PUT/v2/channels/{id}/overrides/{role}groupsЗадать, что роль может в канале иначе.
POST/v2/communities/{id}/categoriesgroupsСоздать категорию для каналов.
PUT/v2/categories/{id}groupsПереименовать категорию.
DELETE/v2/categories/{id}groupsУдалить категорию.
PUT/v2/communities/{id}/feedgroupsВключить или выключить канал ленты группы.
GET/v2/communities/{id}/invitesgroupsСсылки-приглашения группы, которые ещё действуют.
POST/v2/communities/{id}/invitesgroupsСоздать ссылку-приглашение.
DELETE/v2/invites/{code}groupsОтозвать ссылку-приглашение.
POST/v2/channel-messages/{id}/removegroupsУдалить из канала сообщение другого участника.
POST/v2/communities/{id}/posts/{post}/removegroupsУдалить публикацию из группы.
DELETE/v2/communities/{id}/members/{member}groupsИсключить участника из группы.
PUT/v2/communities/{id}/members/{member}/timeoutgroupsЗаглушить участника.
DELETE/v2/communities/{id}/members/{member}/timeoutgroupsСнять заглушение.
GET/v2/communities/{id}/bansgroupsДействующие баны группы.
PUT/v2/communities/{id}/bans/{member}groupsЗабанить участника.
DELETE/v2/communities/{id}/bans/{member}groupsСнять бан.
GET/v2/communities/{id}/loggroupsЖурнал руководства: кто что удалил и почему.
POST/v2/communitiesgroupsСоздать группу. Возвращает её id; ты её основатель.
PUT/v2/communities/{id}groupsИзменить группу, которой ты руководишь. Что не указано, остаётся как есть.
Боты
GET/v2/eventsreadСобытия из групп бота начиная с события, постранично.
GET/v2/events/streamreadСобытия из групп бота, как только они происходят (server-sent events).
GET/v2/me/commandsreadКоманды бота.
PUT/v2/me/commandswriteЗадать команды бота, все сразу.
POST/v2/interactions/{id}/replywriteОтветить на команду или кнопку.
POST/v2/channels/{id}/voicewriteЗанять место в голосовом канале, чтобы проигрывать музыку или звук.
Обзор
GET/v2/tagsreadТеги, которые сейчас в ходу.
GET/v2/searchreadПоиск по постам, именам, коротким именам и тегам.
GET/v2/emojisreadСобственные эмодзи сервера с адресами их картинок.
GIF и видео
GET/v2/mediareadОбщие GIF или видео, сначала самые используемые.
GET/v2/media/minemediaТвоя медиатека, сначала новое.
GET/v2/media/{id}readGIF или видео — твоё или общее.
POST/v2/media/uploadsmediaНачать загрузку.
PUT/v2/media/uploads/{upload}mediaОтправить фрагмент файла.
POST/v2/media/{id}mediaИзменить одно из твоих GIF или видео.
DELETE/v2/media/{id}mediaУдалить одно из твоих GIF или видео.
Твой аккаунт
GET/v2/mereadТвой собственный профиль с id, который ждут остальные пути.
GET/v2/feedreadТвоя собственная лента в том виде, как её собирает приложение.
POST/v2/me/pictureswriteЗагрузить изображение в виде байтов. Возвращает id и url; затем id используется как аватар, обложка или в посте.
PUT/v2/me/profileprofileИзменить профиль: имя, «О себе», аватар, обложку и цвет профиля. Что не указано, остаётся как есть.
GET/v2/me/emojisreadТвои собственные эмодзи.
POST/v2/me/emojis/picturesprofileЗагрузить изображение для своего эмодзи в виде байтов.
POST/v2/me/emojisprofileСоздать свой эмодзи. Возвращает все твои эмодзи.
DELETE/v2/me/emojis/{name}profileУдалить свой эмодзи. Возвращает остальные.
PUT/v2/me/emojis/sharingprofileРешить, могут ли подписчики использовать твои эмодзи в своих текстах.
GET/v2/me/webhookswebhooksТвои вебхуки и их состояние.
POST/v2/me/webhookswebhooksСоздать вебхук. Возвращает id и секрет для подписей, только в этот раз.
DELETE/v2/me/webhooks/{id}webhooksУдалить вебхук.
POST/v2/me/webhooks/{id}/testwebhooksОтправить проверку на вебхук.
Уведомления
GET/v2/notificationsreadТвои уведомления, сначала новые.
POST/v2/notifications/readwriteОтметить уведомления прочитанными.
Сообщения
GET/v2/conversationsreadТвой ящик: по строке на переписку, сначала самая свежая.
GET/v2/conversations/{with}/messagesreadСообщения одной переписки, сначала новые.
POST/v2/conversations/{with}/messageswriteОтправить сообщение в переписку.
POST/v2/conversations/{with}/readwriteОтметить все сообщения переписки прочитанными.
DELETE/v2/conversations/{with}/messages/{id}writeУдалить своё сообщение.
POST/v2/conversations/{with}/plannedwriteЗапланировать сообщение на потом. Возвращает id запланированного сообщения.
GET/v2/me/planned-messagesreadТвои сообщения, которые ещё будут отправлены, по времени.
POST/v2/me/planned-messages/{id}/sendwriteОтправить сейчас задержанное или неудавшееся запланированное сообщение.
DELETE/v2/me/planned-messages/{id}writeУдалить запланированное сообщение до отправки.
Связи
POST/v2/relationswriteОтметить, сохранить, репостнуть, подписаться, вступить, заблокировать, скрыть — в зависимости от kind.
GET/v2/profiles/{handle}/followersreadКто подписан на профиль, новые сначала.
GET/v2/profiles/{handle}/followingreadНа кого подписан профиль, новые сначала.
GET/v2/me/relationsreadКого ты заблокировал, скрыл или заблокировал только для сообщений, новые сначала.
Подборки
GET/v2/me/collectionsreadТвои подборки с числом постов в них.
POST/v2/me/collectionswriteСоздать подборку. Возвращает её id.
PUT/v2/me/collections/{id}writeПереименовать подборку.
DELETE/v2/me/collections/{id}writeУдалить подборку.
GET/v2/me/collections/{id}/postsreadПосты подборки, как во вкладке сохранённого.
POST/v2/me/collections/{id}/postswriteПоложить пост в подборку или убрать его.
Подарки
GET/v2/partner/quotareadСколько ещё осталось в твоей квоте для подарков.
GET/v2/partner/giftsreadЧто ты подарил из квоты, кому и когда – сначала новые.
POST/v2/partner/giftsgiftsПодарить участнику месяцы тарифа или искры из своей квоты.
GET/v2/gift-dropsreadТвои подарки под постами: сколько мест ещё свободно и как они оплачены.
POST/v2/gift-dropsgiftsОпубликовать пост с подарками, которые могут забрать другие.

Вход

Первый запрос любой программы: работает ли ключ и что ему можно?

GET/v2

Версия API и название этого сервера.

  • Право read
  • с ETag
  • с v2.0

Без слеша в конце: https://api.tellmelo.com/v2/ перенаправляет на https://api.tellmelo.com/v2 с 308, и не каждая программа следует за этим.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2"

Ответ

Отвечает одним Service.

Пример
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

Возможные статусы: 200304401429

Посты

Читать публичные посты, публиковать свои и снова удалять их.

GET/v2/posts

Публичные посты, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

На публичных путях counts.likes и counts.reposts всегда 0, а pinned — false.

Посты в группах находятся не здесь, а в /communities/{id}/posts.

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts?limit=20"

Ответ

Отвечает страницей Post в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304401429

GET/v2/posts/{id}

Один пост по его id.

  • Право read
  • с ETag
  • с v2.0

На публичных путях counts.likes и counts.reposts всегда 0, а pinned — false.

Посты в группах находятся не здесь, а в /communities/{id}/posts.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1"

Ответ

Отвечает одним Post.

Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "text": "The bees are back in the garden 🐝 #garden",
  "kind": "poll",
  "author": {
    "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
    "handle": "mara",
    "name": "Mara 🌻",
    "verified": true,
    "accountKind": "person"
  },
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening"
  },
  "media": [
    {
      "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "kind": "image",
      "poster": null,
      "ai": "without"
    }
  ],
  "poll": {
    "options": [
      {
        "text": "Lavender",
        "votes": 12
      },
      {
        "text": "Sunflowers",
        "votes": 7
      },
      {
        "text": "Clover",
        "votes": 3
      }
    ],
    "total": 22,
    "multiple": false,
    "endsAt": null,
    "running": true,
    "resultsVisible": true,
    "myVotes": [
      0
    ]
  },
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 4,
    "likes": 31,
    "reposts": 2
  },
  "pinned": false,
  "giftDrop": {
    "item": "plan",
    "quantity": 3,
    "places": 10,
    "left": 4,
    "audience": "followers",
    "newAccounts": false,
    "status": "open",
    "claimed": true
  },
  "createdAt": 1758624000000
}

Возможные статусы: 200304400401404429

POST/v2/posts

Опубликовать пост.

  • Право write
  • с v2.0

Посту нужен текст или опрос. Длину, варианты опроса и темп задаёт сервер; сверх этого ты получишь 400 или 429.

Прикрепляй изображения, GIF или видео через media. GIF или видео идёт отдельно. Общие GIF и видео других участников можно использовать в tellmelo.

Пост для близких друзей или с соавтором выходит сразу, не в группе и не по расписанию. Оба варианта сразу нельзя.

Параметры

ИмяТипЗначение
textв телеstringнеобязательноТекст поста, ответа или сообщения.
communityв телеstringнеобязательноid группы, в канал ленты которой идёт публикация; канал должен быть включён, и тебе нужно право на это. Без него публикация не относится ни к одной группе.
quotesв телеstringнеобязательноid поста, который цитирует этот.
pollв телеstring[]необязательноВарианты ответа списком текстов.
mediaв телеstring[]необязательноID изображений, загруженных в приложении, или GIF или видео из медиатеки (с 2.14).
audienceв телеstringнеобязательноКто видит пост: everyone — все, кому можно, close — только близкие друзья.everyoneclose
coauthorв телеstringнеобязательноid аккаунта, который ты приглашаешь в соавторы. Вы должны быть подписаны друг на друга.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"The bees are back in the garden 🐝 #garden","audience":"everyone"}' \
  "https://api.tellmelo.com/v2/posts"

Ответ

Отвечает одним Created.

Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

Возможные статусы: 200400401403429

DELETE/v2/posts/{id}

Удалить один из своих постов.

  • Право write
  • с v2.0

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/me/scheduled

Твои посты, которые ещё не вышли, и чего они ждут.

  • Право read
  • с ETag
  • с v2.12

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/scheduled"

Ответ

Отвечает страницей ScheduledPost в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "Market day tomorrow – see you at the bee stand! #garden",
      "communityId": null,
      "publishAt": 1758710400000,
      "deleteAt": null,
      "waitingFor": "time",
      "createdAt": 1758624000000
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

POST/v2/posts/{id}/schedule

Изменить, когда выйдет запланированный пост или когда пост удалится сам.

  • Право write
  • с v2.12

Только свои посты. Пока подарки поста не оплачены, его нельзя запланировать.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
publishAtв телеintegerнеобязательноКогда выйдет запланированный пост, в миллисекундах с 1970 года.
deleteAtв телеintegerнеобязательноКогда пост удалится сам, в миллисекундах с 1970 года.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/schedule"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/posts/{id}/edit

Изменить текст своего поста.

  • Право write
  • с v2.12

Только в пределах времени на правку, которое даёт твой тариф. Запланированные посты править нельзя.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
textв телеstringобязательноТекст поста, ответа или сообщения.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"The bees are back in the garden 🐝🌻 #garden"}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/edit"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/posts/{id}/reply-settings

Кто может отвечать на твой пост, ждут ли ответы одобрения и медленный режим.

  • Право read
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/reply-settings"

Ответ

Отвечает одним ReplySettings.

Пример
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Возможные статусы: 200304400401404429

PUT/v2/posts/{id}/reply-settings

Изменить настройки ответов своего поста. То, что не указано, остаётся как есть.

  • Право write
  • с v2.19

Только свои посты.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
audienceв телеstringнеобязательноКто может отвечать: все, аккаунты, на которые ты подписан, упомянутые или никто.allfollowingmentionednobody
approvalв телеbooleanнеобязательноПоявляются ли ответы только после твоего одобрения.
slowв телеstringнеобязательноМедленный режим: auto включается сам, когда приходит много ответов, on всегда, off никогда.autoonoff

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"audience":"following","approval":false,"slow":"auto"}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/reply-settings"

Ответ

Отвечает одним ReplySettings.

Пример
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Возможные статусы: 200400401403404429

POST/v2/posts/{id}/coauthor

Принять или отклонить приглашение стать соавтором.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
acceptв телеbooleanобязательноtrue принимает приглашение, false отклоняет.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"accept":true}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/coauthor"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/posts/{id}/coauthor

Выйти из соавторов или, как автор, убрать соавтора с поста.

  • Право write
  • с v2.19

Для соавтора и автора поста.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/coauthor"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/posts/{id}/pin

Закрепить свой пост вверху профиля или открепить его.

  • Право write
  • с v2.19

Только свои видимые посты. Сколько можно закрепить, зависит от подписки.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
activeв телеbooleanобязательноtrue закрепляет пост, false открепляет.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"active":true}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/pin"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Ответы

Ответы под постом, списком с parentId.

GET/v2/posts/{id}/replies

Ответы на пост, без заблокированных аккаунтов.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

Список плоский и идёт в порядке написания; parentId превращает его в дерево. Страница всегда содержит целые ветки. Ответы заблокированных аккаунтов исключены.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/replies?limit=20"

Ответ

Отвечает страницей Reply в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a",
      "text": "Same here, the lavender is full of them.",
      "kind": "post",
      "author": {
        "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
        "handle": "jon",
        "name": "Jon",
        "verified": false,
        "accountKind": "person"
      },
      "community": null,
      "media": [],
      "poll": null,
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 0,
        "likes": 3,
        "reposts": 0
      },
      "pinned": false,
      "giftDrop": null,
      "createdAt": 1758624600000,
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "parentId": null
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

POST/v2/posts/{id}/replies

Ответить на пост.

  • Право write
  • с v2.0

В медленном режиме — один ответ на человека раз в 10 минут, иначе 429. Автор и аккаунты, на которые он подписан, освобождены.

Через media — не больше одного изображения, GIF или видео.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
textв телеstringобязательноТекст поста, ответа или сообщения.
parentIdв телеstringнеобязательноid ответа, на который отвечает этот. Без него — прямо к посту.
mediaв телеstring[]необязательноID изображений, загруженных в приложении, или GIF или видео из медиатеки (с 2.14).
publishAtв телеintegerнеобязательноКогда опубликовать ответ, в миллисекундах с 1970 года. Без этого он уходит сразу.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"Same here, the lavender is full of them."}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/replies"

Ответ

Отвечает одним Created.

Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

Возможные статусы: 200400401403404429

POST/v2/replies/{id}/edit

Изменить текст своего ответа.

  • Право write
  • с v2.12

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.
textв телеstringобязательноТекст поста, ответа или сообщения.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"Same here, the lavender and the clover are full of them."}' \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a/edit"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/replies/{id}

Удалить свой ответ.

  • Право write
  • с v2.12

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/replies/{id}/like

Проголосовать «за» ответ (с тех пор как ответы оценивают голосами, отметка «нравится» — это голос «за») или отозвать голос; голос «против» остаётся.

  • Право write
  • с v2.12
  • устарело

Устарело с 2.19: используй POST /replies/{id}/vote. Пока этот маршрут остаётся.

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.
activeв телеbooleanобязательноtrue устанавливает связь, false снимает её.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"active":true}' \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a/like"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/replies/{id}/vote

Проголосовать за ответ или против него либо отозвать свой голос. Возвращает твой голос и итоговый рейтинг.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.
voteв телеstringобязательноup — за, down — против, none отзывает твой голос.updownnone

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"vote":"up"}' \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a/vote"

Ответ

Отвечает одним ReplyVote.

Пример
{
  "vote": "up",
  "score": 12
}

Возможные статусы: 200400401403404429

POST/v2/replies/{id}/pick

Отметить ответ под своим постом как лучший или снять отметку.

  • Право write
  • с v2.19

Только под своими постами и только ответы прямо на пост. Новая отметка заменяет старую.

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.
activeв телеbooleanобязательноtrue отмечает ответ, false снимает отметку.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"active":true}' \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a/pick"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/posts/{id}/replies/waiting

Ответы под постом, ожидающие одобрения: под твоим — все, иначе только твои.

  • Право read
  • с ETag
  • с v2.19

Ждут ли ответы одобрения, автор задаёт в настройках ответов.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/replies/waiting"

Ответ

Отвечает страницей Reply в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a",
      "text": "Same here, the lavender is full of them.",
      "kind": "post",
      "author": {
        "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
        "handle": "jon",
        "name": "Jon",
        "verified": false,
        "accountKind": "person"
      },
      "community": null,
      "media": [],
      "poll": null,
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 0,
        "likes": 3,
        "reposts": 0
      },
      "pinned": false,
      "giftDrop": null,
      "createdAt": 1758624600000,
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "parentId": null
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

POST/v2/replies/{id}/decide

Одобрить или отклонить ожидающий ответ под своим постом. Отклонённый удаляется.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid ответа.
approveв телеbooleanобязательноtrue одобряет ответ, false отклоняет.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"approve":true}' \
  "https://api.tellmelo.com/v2/replies/9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a/decide"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/posts/{id}/replies/planned

Твои ответы под постом, запланированные на потом.

  • Право read
  • с ETag
  • с v2.19

Ответ планируется через publishAt при ответе. Не более 20 запланированных ответов одновременно.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/replies/planned"

Ответ

Отвечает страницей PlannedReply в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
      "parentId": null,
      "text": "Count me in for Saturday!",
      "publishAt": 1758710400000,
      "state": "waiting"
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

PUT/v2/me/planned-replies/{id}

Изменить текст или время запланированного ответа. Неудавшийся снова ждёт.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid запланированного ответа.
textв телеstringнеобязательноТекст поста, ответа или сообщения.
publishAtв телеintegerнеобязательноКогда опубликовать ответ, в миллисекундах с 1970 года. Без этого он уходит сразу.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"See you there!","publishAt":1758700000000}' \
  "https://api.tellmelo.com/v2/me/planned-replies/3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/me/planned-replies/{id}/send

Отправить запланированный ответ сразу.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid запланированного ответа.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/planned-replies/3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9/send"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/me/planned-replies/{id}

Удалить запланированный ответ.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid запланированного ответа.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/planned-replies/3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Опросы

Опрос — это пост, у которого задан poll. У голосования свой путь.

POST/v2/posts/{id}/vote

Принять участие в опросе.

  • Право write
  • с v2.0

Голоса по вариантам равны null, пока ты не проголосовал или опрос не закончился. total есть всегда.

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
optionв телеintegerобязательноКакой вариант, считая с 0. При множественном выборе вызывай по разу на вариант.
retractв телеbooleanнеобязательноtrue отзывает голос.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"option":0}' \
  "https://api.tellmelo.com/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/vote"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Профили

Публичные профили по короткому имени и то, что они опубликовали.

GET/v2/profiles/{handle}

Профиль по его короткому имени.

  • Право read
  • с ETag
  • с v2.0

Параметры

ИмяТипЗначение
handleв путиstringобязательноКороткое имя профиля, регистр букв не важен.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/profiles/mara"

Ответ

Отвечает одним Profile.

Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person",
  "about": "Beekeeper, allotment, too many seeds. :tellmelo:",
  "website": "https://mara-imkerei.example/",
  "websiteVerified": true,
  "followers": 148,
  "createdAt": 1750848000000
}

Возможные статусы: 200304400401404429

GET/v2/profiles/{handle}/posts

Публичные посты одного профиля, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

На публичных путях counts.likes и counts.reposts всегда 0, а pinned — false.

Посты в группах находятся не здесь, а в /communities/{id}/posts.

Параметры

ИмяТипЗначение
handleв путиstringобязательноКороткое имя профиля, регистр букв не важен.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/profiles/mara/posts?limit=20"

Ответ

Отвечает страницей Post в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

GET/v2/profiles/{handle}/events

Предстоящие события профиля, ближайшие сначала.

  • Право read
  • с ETag
  • с v2.19

Только пока подписка профиля включает события. Ничего между аккаунтами, которые заблокировали друг друга.

Параметры

ИмяТипЗначение
handleв путиstringобязательноКороткое имя профиля, регистр букв не важен.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/profiles/mara/events"

Ответ

Отвечает страницей Event в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b",
      "title": "Seed swap",
      "startsAt": 1758883200000,
      "endsAt": 1758890400000,
      "place": "Community garden",
      "description": "Bring seeds, take seeds.",
      "signups": {
        "count": 14,
        "going": true
      }
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

POST/v2/me/events

Создать событие. Возвращает его id.

  • Право write
  • с v2.19

Нужна подписка с событиями, иначе 403. Сколько может быть предстоящих, зависит от подписки.

Параметры

ИмяТипЗначение
titleв телеstringобязательноНазвание.
startsAtв телеintegerобязательноНачало, в миллисекундах с 1970 года.
endsAtв телеintegerнеобязательноКонец, в миллисекундах с 1970 года. Необязательно.
placeв телеstringнеобязательноГде оно проходит.
descriptionв телеstringнеобязательноОписание.
signupsв телеbooleanнеобязательноМожно ли записаться. Нужна подписка с записью.
capacityв телеintegerнеобязательноСколько человек могут записаться максимум. Без указания — без ограничения.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"title":"Seed swap","startsAt":1758700000000,"place":"Community garden","signups":true,"capacity":30}' \
  "https://api.tellmelo.com/v2/me/events"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403429

PUT/v2/me/events/{id}

Изменить своё событие. Все поля задаются заново.

  • Право write
  • с v2.19

Уже начавшееся событие сохраняет своё начало.

Параметры

ИмяТипЗначение
idв путиstringобязательноid события.
titleв телеstringобязательноНазвание.
startsAtв телеintegerобязательноНачало, в миллисекундах с 1970 года.
endsAtв телеintegerнеобязательноКонец, в миллисекундах с 1970 года. Необязательно.
placeв телеstringнеобязательноГде оно проходит.
descriptionв телеstringнеобязательноОписание.
signupsв телеbooleanнеобязательноМожно ли записаться. Нужна подписка с записью.
capacityв телеintegerнеобязательноСколько человек могут записаться максимум. Без указания — без ограничения.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"title":"Seed swap","startsAt":1758700000000,"place":"Community garden","signups":true,"capacity":30}' \
  "https://api.tellmelo.com/v2/me/events/2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

DELETE/v2/me/events/{id}

Удалить своё событие.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid события.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/events/2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/me/events/{id}/signups

Кто записался на твоё событие.

  • Право read
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid события.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/events/2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b/signups"

Ответ

Отвечает страницей EventSignup в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "at": 1758624000000
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

POST/v2/events/{id}/signup

Записаться на событие или отменить запись.

  • Право write
  • с v2.19

Только для событий с записью, не для своих. Если мест нет, 409.

Параметры

ИмяТипЗначение
idв путиstringобязательноid события.
goingв телеbooleanобязательноtrue записывает тебя, false отменяет запись.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"going":true}' \
  "https://api.tellmelo.com/v2/events/2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b/signup"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Группы

Открытые группы и твои собственные, их публикации, участники, роли и ссылки-приглашения.

GET/v2/communities

Открытые группы этого сервера; с mine=true — группы твоего аккаунта.

  • Право read
  • с ETag
  • с v2.0

Отсортированы по числу участников и без пагинации; next всегда null.

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
mineв querybooleanнеобязательноtrue — группы твоего аккаунта, включая внутренние и скрытые, по названию.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities?limit=20"

Ответ

Отвечает страницей Community в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
      "name": "Urban Gardening",
      "handle": "urbangardening",
      "description": "Balconies, allotments, rooftops: whatever grows.",
      "tags": [
        "garden",
        "bees"
      ],
      "members": 312,
      "joinPolicy": "open",
      "visibility": "open",
      "feedChannel": true,
      "sparks": 24,
      "perks": [
        "tint",
        "welcome"
      ],
      "membership": {
        "leader": null,
        "roles": [
          "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
        ],
        "permissions": [
          "attach",
          "invite",
          "send",
          "view"
        ],
        "mutedUntil": null
      }
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

GET/v2/communities/{id}

Одна группа по её id.

  • Право read
  • с ETag
  • с v2.0

Внутренние и скрытые группы — только если твой аккаунт в них состоит.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"

Ответ

Отвечает одним Community.

Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "handle": "urbangardening",
  "description": "Balconies, allotments, rooftops: whatever grows.",
  "tags": [
    "garden",
    "bees"
  ],
  "members": 312,
  "joinPolicy": "open",
  "visibility": "open",
  "feedChannel": true,
  "sparks": 24,
  "perks": [
    "tint",
    "welcome"
  ],
  "membership": {
    "leader": null,
    "roles": [
      "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
    ],
    "permissions": [
      "attach",
      "invite",
      "send",
      "view"
    ],
    "mutedUntil": null
  }
}

Возможные статусы: 200304400401404429

GET/v2/communities/{id}/posts

Публикации канала ленты группы, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

На публичных путях counts.likes и counts.reposts всегда 0, а pinned — false.

Если канал ленты выключен, путь отвечает 409 с feed_off.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/posts?limit=20"

Ответ

Отвечает страницей Post в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

GET/v2/communities/{id}/members

Участники группы с их ролями.

  • Право read
  • с ETag
  • с v2.15

Сначала руководство, затем по высшей роли; не больше 300.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/members"

Ответ

Отвечает страницей GroupMember в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
      "handle": "jon",
      "name": "Jon",
      "bot": false,
      "leader": null,
      "roles": [
        "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
      ],
      "mutedUntil": null
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

GET/v2/communities/{id}/roles

Роли группы, сначала высшая, @everyone последней.

  • Право read
  • с ETag
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/roles"

Ответ

Отвечает страницей Role в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
      "name": "Gardeners",
      "everyone": false,
      "color": "green",
      "permissions": [
        "attach",
        "invite",
        "send",
        "view"
      ],
      "members": 24,
      "editable": true,
      "selfable": false
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

GET/v2/communities/{id}/bell

Какие уведомления присылает тебе группа.

  • Право read
  • с ETag
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bell"

Ответ

Отвечает одним Bell.

Пример
{
  "level": "important"
}

Возможные статусы: 200304400401404429

GET/v2/invites/{code}

Группа за ссылкой-приглашением, до вступления.

  • Право read
  • с ETag
  • с v2.15

Параметры

ИмяТипЗначение
codeв путиstringобязательноКод ссылки-приглашения, конец её адреса.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/invites/k7Qm2xPa"

Ответ

Отвечает одним InvitePreview.

Пример
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

Возможные статусы: 200304400401404429

PUT/v2/roles/{id}/self

Взять или снять роль на выбор.

  • Право write
  • с v2.20

Только роли, которые руководство предлагает на выбор (selfable), и только для своего аккаунта.

Параметры

ИмяТипЗначение
idв путиstringобязательноid роли.
activeв телеbooleanнеобязательноfalse забирает роль; иначе она выдаётся.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"active":true}' \
  "https://api.tellmelo.com/v2/roles/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8/self"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/emojis

Собственные эмодзи группы.

  • Право read
  • с ETag
  • с v2.20

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/emojis"

Ответ

Отвечает страницей GroupEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "seedling",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

PUT/v2/communities/{id}/bell

Настроить, какие уведомления присылает тебе группа.

  • Право write
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
levelв телеstringобязательноКакие уведомления приходят.allimportantoff

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"level":"important"}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bell"

Ответ

Отвечает одним Bell.

Пример
{
  "level": "important"
}

Возможные статусы: 200400401403404429

POST/v2/invites/{code}/join

Вступить в группу по ссылке-приглашению.

  • Право write
  • с v2.15

Параметры

ИмяТипЗначение
codeв путиstringобязательноКод ссылки-приглашения, конец её адреса.
rulesв телеbooleanнеобязательноtrue, если ты принимаешь правила группы; нужно, если они есть.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/invites/k7Qm2xPa/join"

Ответ

Отвечает одним Joined.

Пример
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/bots

Боты группы и то, что разрешает их роль.

  • Право read
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bots"

Ответ

Отвечает страницей GroupBot в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "gardenbot",
      "name": "Garden bot",
      "description": "Reminds the group of watering days.",
      "permissions": [
        "send",
        "view"
      ]
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

Каналы

Каналы твоих групп и их чат: читать, писать, отмечать прочитанным.

GET/v2/communities/{id}/channels

Каналы группы, которые ты видишь, по порядку.

  • Право read
  • с ETag
  • с v2.15

Канал ленты (kind: feed) есть здесь, только пока он включён; его публикации приходят через /communities/{id}/posts.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/channels"

Ответ

Отвечает страницей Channel в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
      "kind": "chat",
      "name": "harvest",
      "topic": "What came in this week",
      "category": {
        "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
        "name": "Garden",
        "symbol": {
          "emoji": null,
          "icon": null,
          "image": null,
          "color": null,
          "shape": null
        }
      },
      "unread": 3,
      "permissions": [
        "view",
        "send"
      ],
      "symbol": {
        "emoji": "🌻",
        "icon": null,
        "image": null,
        "color": "amber",
        "shape": "circle"
      }
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

GET/v2/channels/{id}/messages

Сообщения чат-канала, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.15

До 50 сообщений на странице. Сообщений аккаунтов, которые ты заблокировал или которые заблокировали тебя, нет.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.
threadв querystringнеобязательноСообщение, ветку которого читают: оно и ответы на него вместо чата.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/messages"

Ответ

Отвечает страницей ChannelMessage в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
      "text": "@jon the first tomatoes are ripe 🍅",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "bot": false
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "replyTo": "72b3c4d5-e6f7-4081-92a3-b4c5d6e7f809",
      "roleColor": "green",
      "threadOf": null,
      "threadCount": 3,
      "card": null,
      "buttons": [],
      "createdAt": 1758631200000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

POST/v2/channels/{id}/messages

Написать сообщение в чат-канал.

  • Право write
  • с v2.15

@имя уведомляет участника, @everyone с соответствующим правом — всех, не чаще шести раз в час.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.
textв телеstringнеобязательноТекст поста, ответа или сообщения.
replyToв телеstringнеобязательноid сообщения в том же канале, на которое ты отвечаешь.
mediaв телеstring[]необязательноID изображений, загруженных в приложении, или GIF или видео из медиатеки (с 2.14).
threadв телеstringнеобязательноСообщение чата, в ветке которого отвечают; без него сообщение уходит в чат.
cardв телеobjectнеобязательноКарточка { title, text, color, fields: [{ name, value }] }, не больше 10 полей.
buttonsв телеobject[]необязательноДо 5 кнопок, каждая { id, label, style } со style primary, secondary или danger. Нажатие приходит как событие interaction.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"Who has seeds to swap?"}' \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/messages"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

POST/v2/channels/{id}/read

Отметить чат-канал прочитанным до момента времени.

  • Право write
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.
atв телеintegerобязательноДо какого момента прочитано, в миллисекундах, обычно createdAt самого нового сообщения.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/read"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/channel-messages/{id}

Удалить своё сообщение в чат-канале.

  • Право write
  • с v2.15

Только свои сообщения; чужие удаляет руководство с правом groups.

Параметры

ИмяТипЗначение
idв путиstringобязательноid сообщения в чат-канале.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channel-messages/61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/voice

Кто сейчас в голосовых каналах группы, по каналам.

  • Право read
  • с ETag
  • с v2.19

Только каналы, которые ты можешь видеть. Без медиасервера список пуст.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/voice"

Ответ

Отвечает страницей VoiceRoom в виде `items` и `next`.

Пример
{
  "items": [
    {
      "channel": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
      "people": [
        {
          "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
          "handle": "mara",
          "name": "Mara 🌻",
          "muted": false,
          "deaf": false,
          "camera": false,
          "screen": true
        }
      ]
    }
  ],
  "next": null
}

Возможные статусы: 200304400401404429

Управление группами

То, что умеют настройки группы в приложении, с правом groups. Что может твой аккаунт, решает группа так же, как в приложении: руководство, роли и их порядок.

POST/v2/communities/{id}/emojis

Добавить эмодзи группе.

  • Право groups
  • с v2.20

Только тот, кто может управлять каналами группы. Изображение загружается как собственное эмодзи (POST /me/emojis/pictures); имя занимается один раз среди всех эмодзи.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв телеstringобязательноИмя, которым ты пишешь эмодзи, как :имя:.
pictureв телеstringобязательноid из POST /me/emojis/pictures.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"seedling","picture":"8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/emojis"

Ответ

Отвечает страницей GroupEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "seedling",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false
    }
  ],
  "next": null
}

Возможные статусы: 200400401403404429

DELETE/v2/communities/{id}/emojis/{name}

Удалить эмодзи из группы.

  • Право groups
  • с v2.20

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв путиstringобязательноИмя эмодзи, без двоеточий.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/emojis/seedling"

Ответ

Отвечает страницей GroupEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "seedling",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false
    }
  ],
  "next": null
}

Возможные статусы: 200400401403404429

POST/v2/communities/{id}/roles

Создать роль.

  • Право groups
  • с v2.15

Только роли ниже твоей высшей и только права, которые есть у тебя самого; руководство стоит над всеми.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв телеstringнеобязательноНазвание роли; @everyone сохраняет своё.
colorв телеstringнеобязательноЦвет; пусто — без цвета.indigovioletroseambergreenteal
permissionsв телеstring[]необязательноПрава: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableв телеbooleanнеобязательноtrue: участники берут роль сами. Только для ролей, которые позволяют не больше, чем участвовать (view, send, attach, voice_connect, voice_speak, voice_video).

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Gardeners","permissions":["view","send","invite"],"selfable":false}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/roles"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

PUT/v2/roles/{id}

Изменить название, цвет и права роли.

  • Право groups
  • с v2.15

Заменяет название, цвет и права; то, что ты не укажешь, станет пустым.

Только роли ниже твоей высшей и только права, которые есть у тебя самого; руководство стоит над всеми.

Параметры

ИмяТипЗначение
idв путиstringобязательноid роли.
nameв телеstringнеобязательноНазвание роли; @everyone сохраняет своё.
colorв телеstringнеобязательноЦвет; пусто — без цвета.indigovioletroseambergreenteal
permissionsв телеstring[]необязательноПрава: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableв телеbooleanнеобязательноtrue: участники берут роль сами. Только для ролей, которые позволяют не больше, чем участвовать (view, send, attach, voice_connect, voice_speak, voice_video).

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Gardeners","permissions":["view","send","invite"],"selfable":false}' \
  "https://api.tellmelo.com/v2/roles/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

DELETE/v2/roles/{id}

Удалить роль.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid роли.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/roles/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/communities/{id}/roles/order

Задать порядок ролей.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
rolesв телеstring[]обязательноid всех ролей ниже твоей самой высокой, самая высокая первой; для руководства — все, кроме @everyone.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/roles/order"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/roles/{id}/members/{member}

Выдать участнику роль или забрать её.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid роли.
memberв путиstringобязательноid аккаунта участника.
activeв телеbooleanнеобязательноfalse забирает роль; иначе она выдаётся.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"active":true}' \
  "https://api.tellmelo.com/v2/roles/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8/members/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/communities/{id}/channels

Создать чат-канал.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв телеstringнеобязательноНазвание без #; пусто — название, которое приложение даёт на каждом языке.
topicв телеstringнеобязательноТема, которая показывается над каналом.
categoryв телеstringнеобязательноid категории, в которую попадает канал; пусто — без категории.
emojiв телеstringнеобязательноЭмодзи в качестве символа.
iconв телеstringнеобязательноСимвол из набора приложения, по имени.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageв телеstringнеобязательноID картинки, загруженной через /media/emoji.
colorв телеstringнеобязательноЦвет плитки.brandindigovioletroseambergreentealred
shapeв телеstringнеобязательноФорма плитки; без неё — круг.circlesquaretrianglediamondhexagonoctagonshieldstar

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"harvest","emoji":"🌻","color":"amber"}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/channels"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

PUT/v2/channels/{id}

Изменить название, тему и категорию канала.

  • Право groups
  • с v2.15

Заменяет название, тему и категорию; то, что ты не укажешь, станет пустым.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.
nameв телеstringнеобязательноНазвание без #; пусто — название, которое приложение даёт на каждом языке.
topicв телеstringнеобязательноТема, которая показывается над каналом.
categoryв телеstringнеобязательноid категории, в которую попадает канал; пусто — без категории.
emojiв телеstringнеобязательноЭмодзи в качестве символа.
iconв телеstringнеобязательноСимвол из набора приложения, по имени.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageв телеstringнеобязательноID картинки, загруженной через /media/emoji.
colorв телеstringнеобязательноЦвет плитки.brandindigovioletroseambergreentealred
shapeв телеstringнеобязательноФорма плитки; без неё — круг.circlesquaretrianglediamondhexagonoctagonshieldstar

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"harvest","emoji":"🌻","color":"amber"}' \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

DELETE/v2/channels/{id}

Удалить чат-канал вместе с сообщениями.

  • Право groups
  • с v2.15

Канал ленты нельзя удалить, только выключить.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/communities/{id}/channels/order

Задать порядок категорий и чат-каналов.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
categoriesв телеstring[]обязательноid всех категорий группы в новом порядке.
channelsв телеstring[]обязательноid всех чат-каналов группы в новом порядке.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/channels/order"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/communities/{id}/channels/shape

Задать форму всех символов каналов группы.

  • Право groups
  • с v2.20

Только руководство группы.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
shapeв телеstringнеобязательноФорма всех символов группы; если не указана, у каждого канала своя.circlesquaretrianglediamondhexagonoctagonshieldstar

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/channels/shape"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/channels/{id}/overrides

Что роли могут в канале иначе, чем в группе.

  • Право groups
  • с ETag
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/overrides"

Ответ

Отвечает страницей ChannelOverride в виде `items` и `next`.

Пример
{
  "items": [
    {
      "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
      "allow": [
        "send"
      ],
      "deny": []
    }
  ],
  "next": null
}

Возможные статусы: 200304400401403404429

PUT/v2/channels/{id}/overrides/{role}

Задать, что роль может в канале иначе.

  • Право groups
  • с v2.15

Не для ролей на уровне твоей высшей роли или выше.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.
roleв путиstringобязательноid роли.
allowв телеstring[]необязательноЧто роль может здесь дополнительно: в чате view, send, attach, mention_everyone, moderate, в канале ленты view и post_feed.
denyв телеstring[]необязательноЧто роль здесь не может, из тех же прав. Оба пустых списка снимают отличие.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"allow":["view"],"deny":["send"]}' \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/overrides/4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/communities/{id}/categories

Создать категорию для каналов.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв телеstringобязательноНазвание категории.
emojiв телеstringнеобязательноЭмодзи в качестве символа.
iconв телеstringнеобязательноСимвол из набора приложения, по имени.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageв телеstringнеобязательноID картинки, загруженной через /media/emoji.
colorв телеstringнеобязательноЦвет плитки.brandindigovioletroseambergreentealred

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Garden","emoji":"🌻","color":"amber"}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/categories"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

PUT/v2/categories/{id}

Переименовать категорию.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid категории.
nameв телеstringобязательноНазвание категории.
emojiв телеstringнеобязательноЭмодзи в качестве символа.
iconв телеstringнеобязательноСимвол из набора приложения, по имени.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageв телеstringнеобязательноID картинки, загруженной через /media/emoji.
colorв телеstringнеобязательноЦвет плитки.brandindigovioletroseambergreentealred

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Garden","emoji":"🌻","color":"amber"}' \
  "https://api.tellmelo.com/v2/categories/9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

DELETE/v2/categories/{id}

Удалить категорию.

  • Право groups
  • с v2.15

Её каналы остаются, без категории.

Параметры

ИмяТипЗначение
idв путиstringобязательноid категории.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/categories/9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/communities/{id}/feed

Включить или выключить канал ленты группы.

  • Право groups
  • с v2.15

Когда он выключен, публикации хранятся, но видят их только авторы.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
onв телеbooleanобязательноtrue включает канал ленты, false выключает.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/feed"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/invites

Ссылки-приглашения группы, которые ещё действуют.

  • Право groups
  • с ETag
  • с v2.15

Руководство видит все, остальные — только свои.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/invites"

Ответ

Отвечает страницей InviteLink в виде `items` и `next`.

Пример
{
  "items": [
    {
      "code": "k7Qm2xPa",
      "url": "https://tellmelo.com/groups?join=k7Qm2xPa",
      "createdBy": {
        "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
        "handle": "jon",
        "name": "Jon",
        "bot": false
      },
      "createdAt": 1758624000000,
      "expiresAt": 1759228800000,
      "uses": 3,
      "maxUses": 10
    }
  ],
  "next": null
}

Возможные статусы: 200304400401403404429

POST/v2/communities/{id}/invites

Создать ссылку-приглашение.

  • Право groups
  • с v2.15

Ссылка действует, только пока ты можешь приглашать, и исчезает с твоим выходом.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
daysв телеintegerнеобязательноСколько дней действует ссылка; без этого — пока её не отзовут.1730
usesв телеintegerнеобязательноСколько раз можно использовать ссылку; без этого — без ограничений.151025100

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"days":7,"uses":10}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/invites"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

DELETE/v2/invites/{code}

Отозвать ссылку-приглашение.

  • Право groups
  • с v2.15

Параметры

ИмяТипЗначение
codeв путиstringобязательноКод ссылки-приглашения, конец её адреса.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/invites/k7Qm2xPa"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/channel-messages/{id}/remove

Удалить из канала сообщение другого участника.

  • Право groups
  • с v2.15

С записью в журнале группы и не больше 60 в час, как в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid сообщения в чат-канале.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channel-messages/61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8/remove"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/communities/{id}/posts/{post}/remove

Удалить публикацию из группы.

  • Право groups
  • с v2.15

С записью в журнале группы и не больше 60 в час, как в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
postв путиstringобязательноid поста.
reasonв телеstringобязательноОбоснование, которое прочитает участник.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Advertising for another site, despite rule 2."}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/posts/post/remove"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/communities/{id}/members/{member}

Исключить участника из группы.

  • Право groups
  • с v2.15

С 2.16 это исключение: участник может вернуться. Кто должен остаться за дверью, получает бан.

Только с нужным правом и только для участников ниже твоей высшей роли; соруководителей — только основатель.

С записью в журнале группы и не больше 60 в час, как в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
memberв путиstringобязательноid аккаунта участника.
reasonв телеstringобязательноОбоснование, которое прочитает участник.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Advertising for another site, despite rule 2."}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/members/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

PUT/v2/communities/{id}/members/{member}/timeout

Заглушить участника.

  • Право groups
  • с v2.16

Новое заглушение заменяет текущее. Выход и повторное вступление его не отменяют.

Только с нужным правом и только для участников ниже твоей высшей роли; соруководителей — только основатель.

С записью в журнале группы и не больше 60 в час, как в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
memberв путиstringобязательноid аккаунта участника.
secondsв телеintegerобязательноНа сколько, в секундах.60300600360086400604800
reasonв телеstringнеобязательноПричина, которую прочтёт участник; по желанию.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"seconds":600}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/members/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d/timeout"

Ответ

Отвечает одним Until.

Пример
{
  "until": 1758624600000
}

Возможные статусы: 200400401403404429

DELETE/v2/communities/{id}/members/{member}/timeout

Снять заглушение.

  • Право groups
  • с v2.16

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
memberв путиstringобязательноid аккаунта участника.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/members/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d/timeout"

Ответ

Отвечает одним Until.

Пример
{
  "until": 1758624600000
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/bans

Действующие баны группы.

  • Право groups
  • с ETag
  • с v2.16

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bans"

Ответ

Отвечает страницей Ban в виде `items` и `next`.

Пример
{
  "items": [
    {
      "member": {
        "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
        "handle": "jon",
        "name": "Jon",
        "bot": false
      },
      "until": 1759228800000,
      "createdAt": 1758624000000,
      "by": "Mara 🌻"
    }
  ],
  "next": null
}

Возможные статусы: 200304400401403404429

PUT/v2/communities/{id}/bans/{member}

Забанить участника.

  • Право groups
  • с v2.16

Без days бан действует, пока его не снимут.

Только с нужным правом и только для участников ниже твоей высшей роли; соруководителей — только основатель.

С записью в журнале группы и не больше 60 в час, как в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
memberв путиstringобязательноid аккаунта участника.
daysв телеintegerнеобязательноНа сколько, в днях; не указывай для бессрочного бана.1730
reasonв телеstringобязательноОбоснование, которое прочитает участник.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"days":7,"reason":"Advertising for another site, despite rule 2."}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bans/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d"

Ответ

Отвечает одним Until.

Пример
{
  "until": 1758624600000
}

Возможные статусы: 200400401403404429

DELETE/v2/communities/{id}/bans/{member}

Снять бан.

  • Право groups
  • с v2.16

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
memberв путиstringобязательноid аккаунта участника.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/bans/d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/communities/{id}/log

Журнал руководства: кто что удалил и почему.

  • Право groups
  • с ETag
  • с v2.15

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60/log"

Ответ

Отвечает страницей LogEntry в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "8f7e6d5c-4b3a-4291-8f7e-6d5c4b3a2918",
      "action": "message_removed",
      "member": {
        "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
        "handle": "jon",
        "name": "Jon",
        "bot": false
      },
      "reason": "",
      "by": "Mara 🌻",
      "createdAt": 1758710400000
    }
  ],
  "next": null
}

Возможные статусы: 200304400401403404429

POST/v2/communities

Создать группу. Возвращает её id; ты её основатель.

  • Право groups
  • с v2.19

Нужно разрешение groups. Без указания группа internal со свободным вступлением; скрытая — только по приглашению. Могут ли участники создавать группы, решает оператор.

Параметры

ИмяТипЗначение
nameв телеstringобязательноНазвание, не длиннее 60 символов.
descriptionв телеstringнеобязательноОписание, не длиннее 240 символов.
handleв телеstringнеобязательноКороткое имя для упоминаний @# и ссылки: от 3 до 30 строчных букв, цифр или _.
tagsв телеstring[]необязательноДо 5 #тегов о теме группы.
joinPolicyв телеstringнеобязательноКак вступить: open свободно, application по заявке, invite только по приглашению.openapplicationinvite
visibilityв телеstringнеобязательноКто видит группу: open все, internal её содержимое только участники, hidden вообще только участники.openinternalhidden

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Seed swap","handle":"seedswap","tags":["garden","seeds"],"joinPolicy":"open","visibility":"open"}' \
  "https://api.tellmelo.com/v2/communities"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403429

PUT/v2/communities/{id}

Изменить группу, которой ты руководишь. Что не указано, остаётся как есть.

  • Право groups
  • с v2.19

Нужно разрешение groups и руководство группой. Руководство, роспуск и бонусы искр остаются в приложении.

Параметры

ИмяТипЗначение
idв путиstringобязательноid группы.
nameв телеstringнеобязательноНазвание, не длиннее 60 символов.
descriptionв телеstringнеобязательноОписание, не длиннее 240 символов.
handleв телеstringнеобязательноКороткое имя для упоминаний @# и ссылки: от 3 до 30 строчных букв, цифр или _.
tagsв телеstring[]необязательноДо 5 #тегов о теме группы.
joinPolicyв телеstringнеобязательноКак вступить: open свободно, application по заявке, invite только по приглашению.openapplicationinvite
visibilityв телеstringнеобязательноКто видит группу: open все, internal её содержимое только участники, hidden вообще только участники.openinternalhidden
imageв телеstringнеобязательноid загруженного изображения (POST /me/pictures) для картинки группы. Пусто — удалить.
bannerв телеstringнеобязательноid загруженного изображения для обложки группы. Пусто — удалить.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Seed swap","handle":"seedswap","tags":["garden","seeds"],"joinPolicy":"open","visibility":"open"}' \
  "https://api.tellmelo.com/v2/communities/c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Боты

Что происходит в группах бота, в реальном времени: потоком, постранично или с доставкой на адрес.

GET/v2/events

События из групп бота начиная с события, постранично.

  • Право read
  • с v2.20

Только с токеном бота. События канала — только если бот может его видеть.

События хранятся один день. next — номер последнего, как since для следующей страницы.

Параметры

ИмяТипЗначение
sinceв querystringнеобязательноНомер последнего события, которое у бота уже есть. Без него поток начинается сейчас, а список — с самого старого.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/events?since=0"

Ответ

Отвечает страницей BotEvent в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "4711",
      "type": "message.created",
      "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
      "channel": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
      "createdAt": 1758634800000,
      "data": {
        "message": {
          "id": "61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
          "text": "/dice 6",
          "author": {
            "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
            "handle": "mara",
            "name": "Mara 🌻",
            "bot": false
          },
          "media": 0,
          "replyTo": null,
          "threadOf": null,
          "createdAt": 1758634800000
        }
      }
    }
  ],
  "next": null
}

Возможные статусы: 200401429

GET/v2/events/stream

События из групп бота, как только они происходят (server-sent events).

  • Право read
  • с ETag
  • с v2.20

Соединение остаётся открытым и закрывается через десять минут; клиент переподключается и отправляет Last-Event-ID.

Только с токеном бота. События канала — только если бот может его видеть.

Параметры

ИмяТипЗначение
sinceв querystringнеобязательноНомер последнего события, которое у бота уже есть. Без него поток начинается сейчас, а список — с самого старого.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/events/stream?since=0"

Ответ

Отвечает одним BotEvent.

Пример
{
  "id": "4711",
  "type": "message.created",
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "channel": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
  "createdAt": 1758634800000,
  "data": {
    "message": {
      "id": "61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
      "text": "/dice 6",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "bot": false
      },
      "media": 0,
      "replyTo": null,
      "threadOf": null,
      "createdAt": 1758634800000
    }
  }
}

Возможные статусы: 200304401429

GET/v2/me/commands

Команды бота.

  • Право read
  • с ETag
  • с v2.20

Только с токеном бота. События канала — только если бот может его видеть.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/commands"

Ответ

Отвечает страницей BotCommand в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "dice",
      "description": "Rolls a die"
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

PUT/v2/me/commands

Задать команды бота, все сразу.

  • Право write
  • с v2.20

Заменяет все команды; пустой список убирает их. В чатах, которые бот может видеть, поле ввода предлагает их после «/».

Параметры

ИмяТипЗначение
commandsв телеobject[]обязательноДо 25 команд, каждая { name, description }.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"commands":[{"name":"dice","description":"Rolls a die"}]}' \
  "https://api.tellmelo.com/v2/me/commands"

Ответ

Отвечает страницей BotCommand в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "dice",
      "description": "Rolls a die"
    }
  ],
  "next": null
}

Возможные статусы: 200400401403429

POST/v2/interactions/{id}/reply

Ответить на команду или кнопку.

  • Право write
  • с v2.20

В течение 15 минут после события command или interaction; с private ответ видит только тот, кто использовал команду или кнопку.

Параметры

ИмяТипЗначение
idв путиstringобязательноИдентификатор из события (data.interaction).
textв телеstringнеобязательноТекст поста, ответа или сообщения.
privateв телеbooleanнеобязательноtrue: ответ видит только тот, кто использовал команду или кнопку, в течение дня.
cardв телеobjectнеобязательноКарточка { title, text, color, fields: [{ name, value }] }, не больше 10 полей.
buttonsв телеobject[]необязательноДо 5 кнопок, каждая { id, label, style } со style primary, secondary или danger. Нажатие приходит как событие interaction.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"You rolled a 4.","private":true}' \
  "https://api.tellmelo.com/v2/interactions/9b8c7d6e-5f4a-4b3c-8d2e-1f0a9b8c7d6e/reply"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

POST/v2/channels/{id}/voice

Занять место в голосовом канале, чтобы проигрывать музыку или звук.

  • Право write
  • с v2.20

Только с токеном бота, насколько позволяет его роль в канале. Программа подключается через LiveKit SDK и передаёт звук как микрофон; каждый сам настраивает его громкость.

Параметры

ИмяТипЗначение
idв путиstringобязательноid канала.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/channels/0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a/voice"

Ответ

Отвечает одним VoiceSeat.

Пример
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Возможные статусы: 200400401403404429

Обзор

Тренды, поиск и собственные эмодзи сервера.

GET/v2/tags

Теги, которые сейчас в ходу.

  • Право read
  • с ETag
  • с v2.0

Не больше 10 популярных тегов по весу: каждое использование даёт 1 и вдвое уменьшается каждые 3 дня, один аккаунт даёт не больше 3 в день. posts — округлённый вес. limit только укорачивает список. Теги, выделенные командой, могут стоять выше.

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/tags?limit=10"

Ответ

Отвечает страницей Tag в виде `items` и `next`.

Пример
{
  "items": [
    {
      "tag": "garden",
      "posts": 58
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

GET/v2/search

Поиск по постам, именам, коротким именам и тегам.

  • Право read
  • с ETag
  • с v2.0

Ищет только публичное: посты вне групп, профили и теги. limit действует для каждого вида.

Параметры

ИмяТипЗначение
qв querystringобязательноИскомые слова.
typeв querystringнеобязательноКакой вид результатов. Без него — все виды.allpostsprofilestags
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/search?q=garden&type=posts"

Ответ

Отвечает одним SearchResult.

Пример
{
  "posts": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "profiles": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "tags": [
    {
      "tag": "garden",
      "posts": 58
    }
  ]
}

Возможные статусы: 200304400401429

GET/v2/emojis

Собственные эмодзи сервера с адресами их картинок.

  • Право read
  • с ETag
  • с v2.1

В текстах эмодзи выглядит как :name:. Замени его картинкой из этого списка; неизвестные имена остаются текстом.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/emojis"

Ответ

Отвечает страницей Emoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "tellmelo",
      "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

GIF и видео

Медиатека: искать общие GIF и видео, загружать свои, управлять ими и встраивать их на другие сайты.

GET/v2/media

Общие GIF или видео, сначала самые используемые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.14

Без аккаунтов, которые ты заблокировал или которые заблокировали тебя. url и poster загружай с ключом в заголовке — для постов в tellmelo.

Для других сайтов — только то, у чего есть embed: его адреса работают без ключа в любом браузере.

Параметры

ИмяТипЗначение
kindв querystringнеобязательноgif или video; по умолчанию gif.gifvideo
qв querystringнеобязательноСлова из названия или ключевых слов.
anywhereв querybooleanнеобязательноtrue: только то, что может появляться и на других сайтах.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media?kind=gif&q=bees&anywhere=true&limit=20"

Ответ

Отвечает страницей MediaItem в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "kind": "gif",
      "name": "Happy bees",
      "keywords": "bees garden happy",
      "width": 480,
      "height": 270,
      "seconds": 0,
      "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "poster": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918&poster=1",
      "uploader": {
        "handle": "mara",
        "name": "Mara 🌻"
      },
      "mine": false,
      "shared": true,
      "anywhere": true,
      "embed": {
        "page": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
        "file": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/file",
        "poster": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/poster",
        "code": "<iframe src=\"https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918\" width=\"480\" height=\"300\" title=\"Happy bees\" style=\"border:0;max-width:100%\" loading=\"lazy\" allowfullscreen></iframe>"
      }
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401429

GET/v2/media/mine

Твоя медиатека, сначала новое.

  • Право media
  • с пагинацией
  • с ETag
  • с v2.14

Параметры

ИмяТипЗначение
kindв querystringнеобязательноgif или video; по умолчанию gif.gifvideo
qв querystringнеобязательноСлова из названия или ключевых слов.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/mine?kind=gif&q=bees&limit=20"

Ответ

Отвечает страницей MediaItem в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "kind": "gif",
      "name": "Happy bees",
      "keywords": "bees garden happy",
      "width": 480,
      "height": 270,
      "seconds": 0,
      "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "poster": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918&poster=1",
      "uploader": {
        "handle": "mara",
        "name": "Mara 🌻"
      },
      "mine": false,
      "shared": true,
      "anywhere": true,
      "embed": {
        "page": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
        "file": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/file",
        "poster": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/poster",
        "code": "<iframe src=\"https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918\" width=\"480\" height=\"300\" title=\"Happy bees\" style=\"border:0;max-width:100%\" loading=\"lazy\" allowfullscreen></iframe>"
      }
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401403429

GET/v2/media/{id}

GIF или видео — твоё или общее.

  • Право read
  • с ETag
  • с v2.14

Параметры

ИмяТипЗначение
idв путиstringобязательноID GIF или видео.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"

Ответ

Отвечает одним MediaItem.

Пример
{
  "id": "b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "gif",
  "name": "Happy bees",
  "keywords": "bees garden happy",
  "width": 480,
  "height": 270,
  "seconds": 0,
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "poster": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918&poster=1",
  "uploader": {
    "handle": "mara",
    "name": "Mara 🌻"
  },
  "mine": false,
  "shared": true,
  "anywhere": true,
  "embed": {
    "page": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
    "file": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/file",
    "poster": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/poster",
    "code": "<iframe src=\"https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918\" width=\"480\" height=\"300\" title=\"Happy bees\" style=\"border:0;max-width:100%\" loading=\"lazy\" allowfullscreen></iframe>"
  }
}

Возможные статусы: 200304400401404429

POST/v2/media/uploads

Начать загрузку.

  • Право media
  • с v2.14

Затем отправляй файл фрагментами не больше piece байт на /media/uploads/{upload}. Без нового фрагмента загрузка завершается через 15 минут.

Действуют ограничения приложения: GIF до 15 МБ, видео по размеру и длине в зависимости от подписки, GIF в день, личные GIF, видеобаллы в неделю. Иначе придёт 409, 413 или 429.

Параметры

ИмяТипЗначение
kindв телеstringобязательноgif или video; по умолчанию gif.gifvideo
sizeв телеintegerобязательноРазмер всего файла в байтах.
nameв телеstringобязательноНазвание, по которому его находят: от 2 до 40 символов.
keywordsв телеstringнеобязательноКлючевые слова для поиска через пробел.
sharedв телеbooleanнеобязательноtrue: доступно всем в tellmelo.
anywhereв телеbooleanнеобязательноtrue: доступно всем и разрешено на других сайтах. Только вместе с shared.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"kind":"gif","size":2400000,"name":"Happy bees","keywords":"bees garden","shared":true,"anywhere":false}' \
  "https://api.tellmelo.com/v2/media/uploads"

Ответ

Отвечает одним UploadStarted.

Пример
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

Возможные статусы: 200400401403429

PUT/v2/media/uploads/{upload}

Отправить фрагмент файла.

  • Право media
  • с v2.14

Тело запроса — это сам фрагмент (application/octet-stream), не JSON. Если он не продолжает файл, придёт 409 с received: продолжай оттуда. После последнего фрагмента файл конвертируется; тогда в ответе есть item.

Параметры

ИмяТипЗначение
uploadв путиstringобязательноupload, полученный при начале загрузки.
offsetв queryintegerобязательноС какого места файла начинается фрагмент, в байтах; для первого — 0.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @piece \
  "https://api.tellmelo.com/v2/media/uploads/e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b?offset=0"

Ответ

Отвечает одним UploadPiece.

Пример
{
  "received": 4194304,
  "item": null
}

Возможные статусы: 200400401403404429

POST/v2/media/{id}

Изменить одно из твоих GIF или видео.

  • Право media
  • с v2.14

Параметры

ИмяТипЗначение
idв путиstringобязательноID GIF или видео.
nameв телеstringнеобязательноНазвание, по которому его находят: от 2 до 40 символов.
keywordsв телеstringнеобязательноКлючевые слова для поиска через пробел.
sharedв телеbooleanнеобязательноtrue: доступно всем в tellmelo.
anywhereв телеbooleanнеобязательноtrue: доступно всем и разрешено на других сайтах. Только вместе с shared.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Happy bees","anywhere":true}' \
  "https://api.tellmelo.com/v2/media/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/media/{id}

Удалить одно из твоих GIF или видео.

  • Право media
  • с v2.14

Посты, которые уже его показывают, сохраняют его. На других сайтах оно исчезнет в течение нескольких минут.

Параметры

ИмяТипЗначение
idв путиstringобязательноID GIF или видео.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Твой аккаунт

Твой профиль, твоя лента, твои эмодзи и твои вебхуки.

GET/v2/me

Твой собственный профиль с id, который ждут остальные пути.

  • Право read
  • с ETag
  • с v2.0

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me"

Ответ

Отвечает одним Profile.

Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person",
  "about": "Beekeeper, allotment, too many seeds. :tellmelo:",
  "website": "https://mara-imkerei.example/",
  "websiteVerified": true,
  "followers": 148,
  "createdAt": 1750848000000
}

Возможные статусы: 200304401429

GET/v2/feed

Твоя собственная лента в том виде, как её собирает приложение.

  • Право read
  • с пагинацией
  • с v2.0

Без ETag, потому что порядок всё время меняется. Начатый список остаётся неизменным до конца.

Параметры

ИмяТипЗначение
tabв querystringнеобязательноКакая лента: for-you, following, latest или bookmarks. По умолчанию latest.for-youfollowinglatestbookmarks
tagв querystringнеобязательноТолько посты об этом теге: написанные с ним или распознанные сервером. Без него — без фильтра.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/feed?tab=following&limit=20"

Ответ

Отвечает страницей Post в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200400401429

POST/v2/me/pictures

Загрузить изображение в виде байтов. Возвращает id и url; затем id используется как аватар, обложка или в посте.

  • Право write
  • с v2.19

PNG, JPEG, WebP или GIF, определяется по первым байтам; сохраняется заново без метаданных. Нигде не использованное изображение позже удаляется.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @picture.png \
  "https://api.tellmelo.com/v2/me/pictures"

Ответ

Отвечает одним Picture.

Пример
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

Возможные статусы: 200401403429

PUT/v2/me/profile

Изменить профиль: имя, «О себе», аватар, обложку и цвет профиля. Что не указано, остаётся как есть.

  • Право profile
  • с v2.19

Нужно разрешение profile. Твой @ник остаётся в приложении: это ещё и имя для входа.

Параметры

ИмяТипЗначение
nameв телеstringнеобязательноОтображаемое имя, не длиннее 60 символов.
aboutв телеstringнеобязательноТекст «О себе».
avatarв телеstringнеобязательноid загруженного изображения для аватара. Пусто — удалить.
bannerв телеstringнеобязательноid загруженного изображения для обложки. Пусто — удалить.
colorв телеstringнеобязательноЦвет профиля, с подпиской. null убирает его.indigovioletrosecoralamberlimegreentealskyslatesandnight

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Mara 🌻","about":"Gardening in the city.","avatar":"8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"}' \
  "https://api.tellmelo.com/v2/me/profile"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403429

GET/v2/me/emojis

Твои собственные эмодзи.

  • Право read
  • с ETag
  • с v2.19

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/emojis"

Ответ

Отвечает страницей OwnEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

POST/v2/me/emojis/pictures

Загрузить изображение для своего эмодзи в виде байтов.

  • Право profile
  • с v2.19

Анимированные эмодзи требуют подписки. Если после преобразования изображение слишком большое, оно отклоняется.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @picture.png \
  "https://api.tellmelo.com/v2/me/emojis/pictures"

Ответ

Отвечает одним EmojiPicture.

Пример
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

Возможные статусы: 200401403429

POST/v2/me/emojis

Создать свой эмодзи. Возвращает все твои эмодзи.

  • Право profile
  • с v2.19

Сколько эмодзи можно создать, зависит от подписки.

Параметры

ИмяТипЗначение
nameв телеstringобязательноИмя, которым ты пишешь эмодзи, как :имя:.
pictureв телеstringобязательноid из POST /me/emojis/pictures.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"sunflower","picture":"8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"}' \
  "https://api.tellmelo.com/v2/me/emojis"

Ответ

Отвечает страницей OwnEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Возможные статусы: 200400401403429

DELETE/v2/me/emojis/{name}

Удалить свой эмодзи. Возвращает остальные.

  • Право profile
  • с v2.19

Параметры

ИмяТипЗначение
nameв путиstringобязательноИмя эмодзи, без двоеточий.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/emojis/sunflower"

Ответ

Отвечает страницей OwnEmoji в виде `items` и `next`.

Пример
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Возможные статусы: 200400401403404429

PUT/v2/me/emojis/sharing

Решить, могут ли подписчики использовать твои эмодзи в своих текстах.

  • Право profile
  • с v2.19

Параметры

ИмяТипЗначение
sharedв телеbooleanобязательноtrue делится эмодзи с подписчиками, false — нет.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"shared":true}' \
  "https://api.tellmelo.com/v2/me/emojis/sharing"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403429

GET/v2/me/webhooks

Твои вебхуки и их состояние.

  • Право webhooks
  • с ETag
  • с v2.19

Нужно разрешение webhooks. Вебхуки есть в подписке для организаций или у партнёров.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/webhooks"

Ответ

Отвечает страницей Webhook в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
      "url": "https://example.org/tellmelo-hook",
      "kinds": [
        "reply",
        "mention"
      ],
      "active": true,
      "lastStatus": 200,
      "lastAt": 1758624000000,
      "failures": 0
    }
  ],
  "next": null
}

Возможные статусы: 200304401403429

POST/v2/me/webhooks

Создать вебхук. Возвращает id и секрет для подписей, только в этот раз.

  • Право webhooks
  • с v2.19

Каждая доставка подписана секретом (X-Tellmelo-Signature). Сохрани его: больше он не покажется.

Параметры

ИмяТипЗначение
urlв телеstringобязательноАдрес HTTPS вне локальных сетей, без учётных данных.
kindsв телеstring[]обязательноО чём сообщать вебхуку. Какие виды тебе доступны, зависит от подписки и партнёрства.replymentiongroup_mentionfollowlikerepostmessagequota_changedquota_giftdrop_claimeddrop_empty

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.org/tellmelo-hook","kinds":["reply","mention"]}' \
  "https://api.tellmelo.com/v2/me/webhooks"

Ответ

Отвечает одним WebhookCreated.

Пример
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

Возможные статусы: 200400401403429

DELETE/v2/me/webhooks/{id}

Удалить вебхук.

  • Право webhooks
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid вебхука.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/webhooks/1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/me/webhooks/{id}/test

Отправить проверку на вебхук.

  • Право webhooks
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid вебхука.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/webhooks/1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b/test"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Уведомления

Что происходило вокруг твоего аккаунта, страница за страницей.

GET/v2/notifications

Твои уведомления, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

Чтение ничего не отмечает прочитанным; это делает POST /notifications/read. События одного вида на одном посте делят строку; more говорит, сколько их.

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/notifications?limit=20"

Ответ

Отвечает страницей Notification в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
      "kind": "like",
      "text": null,
      "actor": {
        "handle": "jon",
        "name": "Jon"
      },
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "read": false,
      "more": 2,
      "createdAt": 1758624300000,
      "updatedAt": 1758624900000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304401429

POST/v2/notifications/read

Отметить уведомления прочитанными.

  • Право write
  • с v2.0

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/notifications/read"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200401403429

Сообщения

Твой ящик и переписки. Переписка называется по другому аккаунту.

GET/v2/conversations

Твой ящик: по строке на переписку, сначала самая свежая.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/conversations?limit=20"

Ответ

Отвечает страницей Conversation в виде `items` и `next`.

Пример
{
  "items": [
    {
      "with": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
      "handle": "jon",
      "name": "Jon",
      "excerpt": "See you on Saturday at the market!",
      "truncated": false,
      "fromMe": true,
      "lastMessageId": "7c6b5a49-3827-4165-9f0e-d1c2b3a49586",
      "unread": 0,
      "updatedAt": 1758624060000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304401429

GET/v2/conversations/{with}/messages

Сообщения одной переписки, сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.0

Чтение ничего не отмечает прочитанным; это делает POST /conversations/{with}/read.

Параметры

ИмяТипЗначение
withв путиstringобязательноid другого аккаунта. У переписки нет собственного id.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages?limit=20"

Ответ

Отвечает страницей Message в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "7c6b5a49-3827-4165-9f0e-d1c2b3a49586",
      "text": "See you on Saturday at the market!",
      "from": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "to": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
      "read": true,
      "media": [],
      "replyTo": null,
      "createdAt": 1758624060000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

POST/v2/conversations/{with}/messages

Отправить сообщение в переписку.

  • Право write
  • с v2.0

Действуют правила приложения: кто тебя заблокировал, тому не написать, и учитываются настройки собеседника.

Изображения, GIF и видео нельзя прикрепить к сообщениям через API, только в приложении.

Параметры

ИмяТипЗначение
withв путиstringобязательноid другого аккаунта. У переписки нет собственного id.
textв телеstringобязательноТекст поста, ответа или сообщения.
replyToв телеstringнеобязательноid более раннего сообщения этой переписки, на которое отвечает это. С 2.2.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"See you on Saturday at the market!"}' \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/conversations/{with}/read

Отметить все сообщения переписки прочитанными.

  • Право write
  • с v2.1

Параметры

ИмяТипЗначение
withв путиstringобязательноid другого аккаунта. У переписки нет собственного id.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/read"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/conversations/{with}/messages/{id}

Удалить своё сообщение.

  • Право write
  • с v2.12

Только свои сообщения и только в первые 24 часа после отправки.

Параметры

ИмяТипЗначение
withв путиstringобязательноid другого аккаунта. У переписки нет собственного id.
idв путиstringобязательноid сообщения.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages/7c6b5a49-3827-4165-9f0e-d1c2b3a49586"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

POST/v2/conversations/{with}/planned

Запланировать сообщение на потом. Возвращает id запланированного сообщения.

  • Право write
  • с v2.19

Нужна подписка с запланированными сообщениями, иначе 403. При сквозном шифровании у обеих сторон работает только в приложении.

Параметры

ИмяТипЗначение
withв путиstringобязательноid другого аккаунта. У переписки нет собственного id.
textв телеstringобязательноТекст поста, ответа или сообщения.
sendAtв телеintegerобязательноКогда отправить сообщение, в миллисекундах с 1970 года.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"Happy birthday! 🎂","sendAt":1758700000000}' \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/planned"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403404429

GET/v2/me/planned-messages

Твои сообщения, которые ещё будут отправлены, по времени.

  • Право read
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
withв querystringнеобязательноТолько сообщения для этого аккаунта (его id).

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/planned-messages"

Ответ

Отвечает страницей PlannedMessage в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
      "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "text": "Happy birthday! 🎂",
      "sendAt": 1758710400000,
      "state": "waiting"
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

POST/v2/me/planned-messages/{id}/send

Отправить сейчас задержанное или неудавшееся запланированное сообщение.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid запланированного сообщения.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/planned-messages/3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9/send"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/me/planned-messages/{id}

Удалить запланированное сообщение до отправки.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid запланированного сообщения.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/planned-messages/3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Связи

Отметить, сохранить, репостнуть, подписаться, вступить, заблокировать: один путь, ставится и снимается через active. С 2.19 также списки: подписчики, подписки и твои блокировки и скрытия.

POST/v2/relations

Отметить, сохранить, репостнуть, подписаться, вступить, заблокировать, скрыть — в зависимости от kind.

  • Право write
  • с v2.0

target — пост для like, save и repost, группа для join, аккаунт для follow, block и mute. active: false снимает связь.

Параметры

ИмяТипЗначение
kindв телеstringобязательноКакая связь: like, save, repost, follow, join, block или mute (с 2.2).likesaverepostfollowjoinblockmute
targetв телеstringобязательноid поста, профиля или группы, в зависимости от kind.
activeв телеbooleanнеобязательноtrue устанавливает связь, false снимает её.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"kind":"like","target":"5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1","active":true}' \
  "https://api.tellmelo.com/v2/relations"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403429

GET/v2/profiles/{handle}/followers

Кто подписан на профиль, новые сначала.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
handleв путиstringобязательноКороткое имя профиля, регистр букв не важен.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/profiles/mara/followers?limit=20"

Ответ

Отвечает страницей ProfileBrief в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

GET/v2/profiles/{handle}/following

На кого подписан профиль, новые сначала.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.19

Параметры

ИмяТипЗначение
handleв путиstringобязательноКороткое имя профиля, регистр букв не важен.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/profiles/mara/following?limit=20"

Ответ

Отвечает страницей ProfileBrief в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401404429

GET/v2/me/relations

Кого ты заблокировал, скрыл или заблокировал только для сообщений, новые сначала.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.19

Только твои собственные списки. Ставить и снимать — через POST /relations.

Параметры

ИмяТипЗначение
kindв querystringобязательноblock — заблокированные, mute — скрытые, dm_block — заблокированные только для сообщений.blockmutedm_block
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/relations?kind=mute&limit=20"

Ответ

Отвечает страницей ProfileBrief в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304400401429

Подборки

Раскладывай сохранённые посты по своим подборкам. Пост может быть в нескольких; убранный из подборки, он остаётся сохранённым.

GET/v2/me/collections

Твои подборки с числом постов в них.

  • Право read
  • с ETag
  • с v2.19

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/collections"

Ответ

Отвечает страницей Collection в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
      "name": "Recipes",
      "count": 12
    }
  ],
  "next": null
}

Возможные статусы: 200304401429

POST/v2/me/collections

Создать подборку. Возвращает её id.

  • Право write
  • с v2.19

Сколько подборок можно создать, зависит от подписки.

Параметры

ИмяТипЗначение
nameв телеstringобязательноНазвание, не длиннее 40 символов. Уникально в аккаунте без учёта регистра.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Recipes"}' \
  "https://api.tellmelo.com/v2/me/collections"

Ответ

Отвечает одним Made.

Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Возможные статусы: 200400401403429

PUT/v2/me/collections/{id}

Переименовать подборку.

  • Право write
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid подборки.
nameв телеstringобязательноНазвание, не длиннее 40 символов. Уникально в аккаунте без учёта регистра.

Пример запроса

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Baking"}' \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

DELETE/v2/me/collections/{id}

Удалить подборку.

  • Право write
  • с v2.19

Посты в ней остаются сохранёнными.

Параметры

ИмяТипЗначение
idв путиstringобязательноid подборки.

Пример запроса

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

GET/v2/me/collections/{id}/posts

Посты подборки, как во вкладке сохранённого.

  • Право read
  • с пагинацией
  • с v2.19

Параметры

ИмяТипЗначение
idв путиstringобязательноid подборки.
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718/posts?limit=20"

Ответ

Отвечает страницей Post в виде `items` и `next`.

Пример
{
  "items": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200400401404429

POST/v2/me/collections/{id}/posts

Положить пост в подборку или убрать его.

  • Право write
  • с v2.19

Пост, положенный в подборку, тоже сохраняется. Только видимые посты.

Параметры

ИмяТипЗначение
idв путиstringобязательноid подборки.
postв телеstringобязательноid поста.
insideв телеbooleanнеобязательноtrue кладёт пост (по умолчанию), false убирает.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"post":"5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1","inside":true}' \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718/posts"

Ответ

Отвечает одним Ok.

Пример
{
  "ok": true
}

Возможные статусы: 200400401403404429

Подарки

Смотреть квоту партнёра и дарить из неё, ставить подарки под посты и следить за ними. Забирать подарки могут только люди, в приложении.

GET/v2/partner/quota

Сколько ещё осталось в твоей квоте для подарков.

  • Право read
  • с ETag
  • с v2.12

Только для партнёров с квотой; остальные получают 403.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/partner/quota"

Ответ

Отвечает одним Quota.

Пример
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

Возможные статусы: 200304401429

GET/v2/partner/gifts

Что ты подарил из квоты, кому и когда – сначала новые.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.12

Только для партнёров с квотой; остальные получают 403.

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/partner/gifts?limit=20"

Ответ

Отвечает страницей QuotaGift в виде `items` и `next`.

Пример
{
  "items": [
    {
      "item": "plan",
      "quantity": 3,
      "itemId": null,
      "recipient": {
        "handle": "jon",
        "name": "Jon"
      },
      "createdAt": 1758627600000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304401429

POST/v2/partner/gifts

Подарить участнику месяцы тарифа или искры из своей квоты.

  • Право gifts
  • с v2.12

Только для партнёров с квотой; остальные получают 403.

Как и в приложении, участник видит, от кого подарок. Не больше 60 подарков в час.

Параметры

ИмяТипЗначение
handleв телеstringобязательно@имя участника, которому ты даришь, с @ или без.
itemв телеstringобязательноplan – месяцы тарифа, sparks – искры, shop – оформление из твоего запаса (с 2.13).plansparksshop
quantityв телеintegerнеобязательноСколько: до 12 месяцев или 35 искр за подарок.
itemIdв телеstringнеобязательноДля shop: ID оформления, как его называет looks в квоте. Один экземпляр на подарок; quantity тогда не действует.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"handle":"jon","item":"plan","quantity":3,"itemId":"frame-gold"}' \
  "https://api.tellmelo.com/v2/partner/gifts"

Ответ

Отвечает одним Quota.

Пример
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

Возможные статусы: 200400401403429

GET/v2/gift-drops

Твои подарки под постами: сколько мест ещё свободно и как они оплачены.

  • Право read
  • с пагинацией
  • с ETag
  • с v2.12

Параметры

ИмяТипЗначение
limitв queryintegerнеобязательноЗаписей на страницу: по умолчанию 20, максимум 50.
cursorв querystringнеобязательноnext из предыдущего ответа. Без него — с начала.

Пример запроса

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/gift-drops?limit=20"

Ответ

Отвечает страницей OwnGiftDrop в виде `items` и `next`.

Пример
{
  "items": [
    {
      "item": "plan",
      "quantity": 3,
      "places": 10,
      "left": 4,
      "audience": "followers",
      "newAccounts": false,
      "status": "open",
      "claimed": false,
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "funding": "quota",
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Возможные статусы: 200304401429

POST/v2/gift-drops

Опубликовать пост с подарками, которые могут забрать другие.

  • Право gifts
  • с v2.12

Бесплатно для владельца и членов команды с этим правом, иначе – из твоей квоты. Всё, за что пришлось бы платить, отклоняется с 422: платить можно только в приложении.

Забрать подарок можно только в приложении, чтобы ни одна программа не разобрала все места. Сколько мест ещё свободно, видно в giftDrop поста.

Параметры

ИмяТипЗначение
textв телеstringнеобязательноТекст поста, ответа или сообщения.
communityв телеstringнеобязательноid группы, в канал ленты которой идёт публикация; канал должен быть включён, и тебе нужно право на это. Без него публикация не относится ни к одной группе.
itemв телеstringобязательноplan – месяцы тарифа, sparks – искры.plansparks
quantityв телеintegerобязательноЧто входит в каждое место: до 12 месяцев или 35 искр.
placesв телеintegerобязательноНа сколько человек, до 10 000.
audienceв телеstringнеобязательноКто может забрать: all – все, followers – только твои подписчики, group – только участники группы (только вместе с community).allfollowersgroup
newAccountsв телеbooleanнеобязательноtrue разрешает забирать и аккаунтам младше 7 дней. Без этого они остаются в стороне.

Пример запроса

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"text":"Ten times three months of Supporter – first come, first served! 🎁","item":"plan","quantity":3,"places":10,"audience":"all","newAccounts":false}' \
  "https://api.tellmelo.com/v2/gift-drops"

Ответ

Отвечает одним DropCreated.

Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Возможные статусы: 200400401403429

Объекты

Все объекты, поле за полем. [] означает список.

Service

Ответ корня: кто отвечает и что может этот ключ.

ПолеТипЗначение
namestringВсегда tellmelo.
versionstringВерсия API, например 2.1.
scopestringЧто может этот ключ: read или read write.
rateLimitRateLimitБюджет этого ключа.
docsstringГде эта документация, в виде пути на этом сервере.
specstringГде машиночитаемое описание.
Пример
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

RateLimit

Бюджет этого ключа в текущей минуте.

ПолеТипЗначение
limitintegerЗапросов в минуту.
remainingintegerСколько осталось в этой минуте.
Пример
{
  "limit": 120,
  "remaining": 117
}

Post

Пост, везде в одной и той же форме.

ПолеТипЗначение
idstringid поста.
textstringили nullТекст как написан (null для поста, который только опрос или только картинки).
kindstringЧто это за пост.
  • post — Пост с текстом, картинками или цитатой.
  • poll — Пост с опросом.
authorProfileBriefКто его написал.
communityCommunityBriefили nullГруппа, в которой он написан (null вне групп).
mediaMedia[]Его изображения по порядку; пусто, если их нет.
pollPollили nullОпрос (null, если его нет).
quotesstringили nullid поста, который цитирует этот.
continuesstringили nullid поста, который продолжает этот как дополнение.
countsCountsОтветы, отметки и репосты.
pinnedbooleanЗакреплён ли он наверху профиля автора.
giftDropGiftDropили nullПодарки под постом, которые можно забрать (null, если их нет).
createdAtintegerКогда он написан.
Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "text": "The bees are back in the garden 🐝 #garden",
  "kind": "poll",
  "author": {
    "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
    "handle": "mara",
    "name": "Mara 🌻",
    "verified": true,
    "accountKind": "person"
  },
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening"
  },
  "media": [
    {
      "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "kind": "image",
      "poster": null,
      "ai": "without"
    }
  ],
  "poll": {
    "options": [
      {
        "text": "Lavender",
        "votes": 12
      },
      {
        "text": "Sunflowers",
        "votes": 7
      },
      {
        "text": "Clover",
        "votes": 3
      }
    ],
    "total": 22,
    "multiple": false,
    "endsAt": null,
    "running": true,
    "resultsVisible": true,
    "myVotes": [
      0
    ]
  },
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 4,
    "likes": 31,
    "reposts": 2
  },
  "pinned": false,
  "giftDrop": {
    "item": "plan",
    "quantity": 3,
    "places": 10,
    "left": 4,
    "audience": "followers",
    "newAccounts": false,
    "status": "open",
    "claimed": true
  },
  "createdAt": 1758624000000
}

Reply

Ответ под постом: пост с двумя дополнительными полями.

Все поля Post, а также:

ПолеТипЗначение
postIdstringПост, к которому относится вся ветка.
parentIdstringили nullОтвет, на который отвечает этот (null, если отвечает прямо на пост).
Пример
{
  "id": "9e4b1c7d-2a3f-4d5e-8b6c-0f1e2d3c4b5a",
  "text": "Same here, the lavender is full of them.",
  "kind": "post",
  "author": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "verified": false,
    "accountKind": "person"
  },
  "community": null,
  "media": [],
  "poll": null,
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 0,
    "likes": 3,
    "reposts": 0
  },
  "pinned": false,
  "giftDrop": null,
  "createdAt": 1758624600000,
  "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "parentId": null
}

ReplyVote

Твой голос за ответ и его рейтинг.

ПолеТипЗначение
votestringТвой голос.
  • up — За.
  • down — Против.
  • none — Нет голоса.
scoreintegerГолоса за минус голоса против, может быть ниже нуля.
Пример
{
  "vote": "up",
  "score": 12
}

PlannedReply

Твой ответ, запланированный на потом.

ПолеТипЗначение
idstringid запланированного ответа.
parentIdstringили nullОтвет, на который он ответит (null, если прямо на пост).
textstringТекст.
publishAtintegerКогда он выйдет.
statestringЕго состояние.
  • waiting — Ждёт своего времени.
  • failed — Не удалось отправить, например, потому что поста больше нет.
Пример
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "parentId": null,
  "text": "Count me in for Saturday!",
  "publishAt": 1758710400000,
  "state": "waiting"
}

ReplySettings

Настройки ответов одного из твоих постов.

ПолеТипЗначение
audiencestringКто может отвечать.
  • all — Все.
  • following — Аккаунты, на которые ты подписан.
  • mentioned — Упомянутые в посте.
  • nobody — Никто, кроме тебя.
approvalbooleanЖдут ли ответы твоего одобрения.
slowstringМедленный режим.
  • auto — Включается сам, когда приходит много ответов.
  • on — Всегда включён.
  • off — Выключен.
Пример
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Counts

Сколько у поста ответов, отметок и репостов.

ПолеТипЗначение
repliesintegerОтветы, все уровни вместе.
likesintegerОтметки «нравится».
repostsintegerРепосты.
Пример
{
  "replies": 4,
  "likes": 31,
  "reposts": 2
}

Media

Изображение поста или сообщения.

ПолеТипЗначение
urlstringАдрес картинки или видео относительно этого сервера. Загружай с ключом в заголовке.
kindstringimage, video или gif (с 2.10). Видео и GIF — это файлы MP4.
  • image — Изображение (WebP или JPEG).
  • video — Видео в MP4 со звуком.
  • gif — GIF в виде беззвучного зацикленного MP4.
posterstringили nullДля видео и GIF адрес картинки предпросмотра, иначе null (с 2.10).
aistringили nullСоздано ли изображение с ИИ, как указал загрузивший или отметила команда после жалобы; null без отметки (с 2.11).
  • with — Создано с ИИ.
  • without — Создано без ИИ.
Пример
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null,
  "ai": "without"
}

Poll

Опрос поста.

ПолеТипЗначение
optionsPollOption[]Варианты по порядку. option при голосовании считается с 0.
totalintegerВсе голоса вместе, всегда есть.
multiplebooleanМожно ли выбрать больше одного варианта.
endsAtintegerили nullКогда опрос заканчивается (null, если он без конца).
runningbooleanМожно ли ещё голосовать.
resultsVisiblebooleanПоказываются ли голоса по вариантам (см. votes).
myVotesinteger[]Выбранные тобой варианты, считая с 0.
Пример
{
  "options": [
    {
      "text": "Lavender",
      "votes": 12
    },
    {
      "text": "Sunflowers",
      "votes": 7
    },
    {
      "text": "Clover",
      "votes": 3
    }
  ],
  "total": 22,
  "multiple": false,
  "endsAt": null,
  "running": true,
  "resultsVisible": true,
  "myVotes": [
    0
  ]
}

PollOption

Один вариант ответа опроса.

ПолеТипЗначение
textstringВариант ответа.
votesintegerили nullЕго голоса (null, пока результаты скрыты).
Пример
{
  "text": "Lavender",
  "votes": 12
}

ProfileBrief

Профиль, как он появляется внутри других объектов: как автор, в поиске.

ПолеТипЗначение
idstringid аккаунта: то, что ждут /relations и /conversations/{with}.
handlestringКороткое имя, без @, в том написании, которое выбрал участник.
namestringОтображаемое имя. Может содержать эмодзи, в том числе :name:.
verifiedbooleanПодтверждён ли аккаунт.
accountKindstringКакого вида аккаунт.
  • person — Человек.
  • business — Компания.
  • association — Клуб или объединение.
  • automated — Автоматический аккаунт, например бот.
  • bot — Бот групп, которым управляет программа с собственным ключом (с 2.18).
Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person"
}

Profile

Профиль сам по себе, с описанием и подписчиками.

Все поля ProfileBrief, а также:

ПолеТипЗначение
aboutstringили nullОписание (null, если его нет).
websitestringили nullСайт профиля (null, если его нет). С 2.3.
websiteVerifiedbooleanСсылается ли сайт на этот профиль через rel=me, проверяется еженедельно. С 2.3.
followersintegerСколько аккаунтов на него подписаны.
createdAtintegerили nullКогда создан аккаунт (null, пока участник скрывает дату регистрации; с 2.9).
Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person",
  "about": "Beekeeper, allotment, too many seeds. :tellmelo:",
  "website": "https://mara-imkerei.example/",
  "websiteVerified": true,
  "followers": 148,
  "createdAt": 1750848000000
}

CommunityBrief

Группа, в которой написан пост.

ПолеТипЗначение
idstringid группы.
namestringили nullЕё название.
Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening"
}

Community

Группа этого сервера.

ПолеТипЗначение
idstringid группы.
namestringЕё название.
handlestringили nullКороткое имя для упоминания группы через @#. С 2.15.
descriptionstringили nullОписание (null, если его нет).
tagsstring[]Темы, которым она посвящена.
membersintegerСколько в ней участников.
joinPolicystringКак в неё попасть.
  • open — Вступить может любой.
  • application — Для вступления нужна заявка, которую принимает группа.
  • invite — Только по приглашению.
visibilitystringКто её видит. internal и hidden — только участники (с 2.15).
  • open — Видна всем.
  • internal — Нет в каталоге, но доступна по адресу.
  • hidden — Только для участников.
feedChannelbooleanВключён ли её канал ленты. С 2.15.
sparksintegerСколько искр сейчас у группы (с 2.19).
perksstring[]Бонусы, которые оплачивают её искры (с 2.19).
membershipMembershipили nullКто твой аккаунт в группе и что он может; null, если он не участник. С 2.15.
Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "handle": "urbangardening",
  "description": "Balconies, allotments, rooftops: whatever grows.",
  "tags": [
    "garden",
    "bees"
  ],
  "members": 312,
  "joinPolicy": "open",
  "visibility": "open",
  "feedChannel": true,
  "sparks": 24,
  "perks": [
    "tint",
    "welcome"
  ],
  "membership": {
    "leader": null,
    "roles": [
      "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
    ],
    "permissions": [
      "attach",
      "invite",
      "send",
      "view"
    ],
    "mutedUntil": null
  }
}

Membership

Кто твой аккаунт в группе и что он может.

ПолеТипЗначение
leaderstringили nullОсновал ли ты группу или ведёшь её вместе с основателем; иначе null.
  • founder — Основатель.
  • manager — Соруководитель.
rolesstring[]id твоих ролей, сначала высшая.
permissionsstring[]Что ты можешь в группе.
mutedUntilintegerили nullДо какого времени тебя здесь заглушает таймаут; null, если нет.
Пример
{
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "mutedUntil": null
}

Person

Участник, кратко.

ПолеТипЗначение
idstringid аккаунта.
handlestringИмя пользователя без @.
namestringОтображаемое имя.
botbooleanЯвляется ли аккаунт ботом (с 2.18).
Пример
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false
}

Channel

Канал группы.

ПолеТипЗначение
idstringid.
kindstringТип канала.
  • feed — Канал ленты, публикации которого есть и в публичной ленте.
  • chat — Чат.
  • voice — Голосовой канал; говорить можно только в приложении.
  • hub — Хаб группы: её страница о том, что она такое. Есть всегда, без сообщений.
namestringили nullНазвание без #; null — название, которое приложение даёт на каждом языке.
topicstringТема; пусто, если её нет.
categoryChannelCategoryили nullКатегория; null, если нет.
unreadintegerСколько сообщений других ты ещё не прочитал, до 100.
permissionsstring[]Что ты можешь в этом канале.
symbolChannelSymbolЕго символ; форма — уже групповая, если группа её задаёт.
Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
  "kind": "chat",
  "name": "harvest",
  "topic": "What came in this week",
  "category": {
    "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
    "name": "Garden",
    "symbol": {
      "emoji": null,
      "icon": null,
      "image": null,
      "color": null,
      "shape": null
    }
  },
  "unread": 3,
  "permissions": [
    "view",
    "send"
  ],
  "symbol": {
    "emoji": "🌻",
    "icon": null,
    "image": null,
    "color": "amber",
    "shape": "circle"
  }
}

ChannelCategory

Категория, в которой находится канал.

ПолеТипЗначение
idstringid.
namestringНазвание.
symbolChannelSymbolЕё символ.
Пример
{
  "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "name": "Garden",
  "symbol": {
    "emoji": null,
    "icon": null,
    "image": null,
    "color": null,
    "shape": null
  }
}

ChannelSymbol

Символ канала или категории: не больше одного из эмодзи, символа и картинки, иначе знак его вида.

ПолеТипЗначение
emojistringили nullЭмодзи; null, если нет.
iconstringили nullИмя символа из набора приложения; null, если нет.
imagestringили nullАдрес своей картинки; null, если нет.
colorstringили nullЦвет плитки; null — цвет его вида.
shapestringили nullФорма плитки; null — круг.
Пример
{
  "emoji": "🌻",
  "icon": null,
  "image": null,
  "color": "amber",
  "shape": "circle"
}

ChannelMessage

Сообщение в чат-канале.

ПолеТипЗначение
idstringid.
textstringили nullТекст (null у сообщения только из изображений или голоса).
authorPersonКто его написал.
mediaMedia[]Его изображения и голосовые сообщения; пусто, если их нет.
replyTostringили nullid сообщения, на которое оно отвечает; null, если ни на какое.
roleColorstringили nullЦвет высшей роли автора, у которой есть цвет; null, если нет.
threadOfstringили nullСообщение, в ветке которого отвечает это; в чате null.
threadCountintegerСколько ответов в ветке этого сообщения.
cardobjectили nullКарточка бота: title, text, color и fields; иначе null.
buttonsobject[]Кнопки бота: у каждой id, label и style.
createdAtintegerКогда оно написано.
Пример
{
  "id": "61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
  "text": "@jon the first tomatoes are ripe 🍅",
  "author": {
    "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
    "handle": "mara",
    "name": "Mara 🌻",
    "bot": false
  },
  "media": [
    {
      "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
      "kind": "image",
      "poster": null,
      "ai": "without"
    }
  ],
  "replyTo": "72b3c4d5-e6f7-4081-92a3-b4c5d6e7f809",
  "roleColor": "green",
  "threadOf": null,
  "threadCount": 3,
  "card": null,
  "buttons": [],
  "createdAt": 1758631200000
}

Role

Роль группы.

ПолеТипЗначение
idstringid.
namestringили nullНазвание; null у @everyone.
everyonebooleanЭто ли @everyone, роль всех участников.
colorstringили nullЦвет: indigo, violet, rose, amber, green или teal; null, если нет.
permissionsstring[]Её права.
membersintegerУ скольких она есть; у @everyone — все участники.
editablebooleanМожет ли твой аккаунт её менять.
selfablebooleanБерут ли участники роль сами и снимают ли её.
Пример
{
  "id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "name": "Gardeners",
  "everyone": false,
  "color": "green",
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "members": 24,
  "editable": true,
  "selfable": false
}

GroupMember

Участник группы с его ролями.

Все поля Person, а также:

ПолеТипЗначение
leaderstringили nullОсновал ли участник группу или ведёт её вместе с основателем; иначе null.
  • founder — Основатель.
  • manager — Соруководитель.
rolesstring[]id его ролей, сначала высшая.
mutedUntilintegerили nullДо какого времени участник заглушён, если твой аккаунт может заглушать; иначе null.
Пример
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false,
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "mutedUntil": null
}

ChannelOverride

Что роль может в канале иначе, чем в группе.

ПолеТипЗначение
rolestringid роли.
allowstring[]Что она может здесь дополнительно.
denystring[]Что она здесь не может.
Пример
{
  "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "allow": [
    "send"
  ],
  "deny": []
}

Bell

Колокольчик группы.

ПолеТипЗначение
levelstringКакие уведомления приходят.
  • all — Каждая новая публикация в канале ленты, плюс @everyone.
  • important — Публикации руководства в канале ленты, плюс @everyone.
  • off — Ничего, кроме упоминаний через @имя.
Пример
{
  "level": "important"
}

InviteLink

Ссылка-приглашение группы.

ПолеТипЗначение
codestringКод.
urlstringАдрес, которым можно поделиться.
createdByPersonили nullКто её создал; null, если аккаунт удалён.
createdAtintegerКогда она создана.
expiresAtintegerили nullДо какого времени действует; null — бессрочно.
usesintegerСколько раз её использовали.
maxUsesintegerили nullСколько раз её можно использовать; null — без ограничений.
Пример
{
  "code": "k7Qm2xPa",
  "url": "https://tellmelo.com/groups?join=k7Qm2xPa",
  "createdBy": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "createdAt": 1758624000000,
  "expiresAt": 1759228800000,
  "uses": 3,
  "maxUses": 10
}

InvitePreview

Куда ведёт ссылка-приглашение.

ПолеТипЗначение
communityInviteGroupГруппа.
memberbooleanСостоит ли твой аккаунт уже в группе.
Пример
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

InviteGroup

Группа за ссылкой-приглашением.

ПолеТипЗначение
idstringid.
namestringНазвание.
membersintegerСколько в ней участников.
rulesstring[]Её правила, которые принимают при вступлении; пусто, если их нет.
Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "members": 312,
  "rules": [
    "Be kind.",
    "No advertising."
  ]
}

Joined

Вступление по ссылке-приглашению.

ПолеТипЗначение
communitystringid группы.
Пример
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

LogEntry

Запись в журнале руководства.

ПолеТипЗначение
idstringid.
actionstringЧто произошло.
  • post_removed — Публикация.
  • member_removed — Участник удалён, до 2.16 (на 90 дней).
  • message_removed — Сообщение в чат-канале.
  • member_kicked — Исключение.
  • member_banned — Бан.
  • member_unbanned — Снятый бан.
  • member_timed_out — Заглушение.
  • timeout_lifted — Снятое заглушение.
  • voice_muted — Микрофон отключён в голосовом канале.
  • voice_removed — Отключение от голосового канала.
  • bot_added — Бот добавлен в группу (с 2.18).
  • bot_removed — Бот удалён из группы (с 2.18).
memberPersonКого это касалось.
reasonstringПричина; пусто для сообщений и если её не указали.
bystringили nullИмя того, кто это сделал; null, если аккаунт удалён.
createdAtintegerКогда.
Пример
{
  "id": "8f7e6d5c-4b3a-4291-8f7e-6d5c4b3a2918",
  "action": "message_removed",
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "reason": "",
  "by": "Mara 🌻",
  "createdAt": 1758710400000
}

Ban

Бан в группе.

ПолеТипЗначение
memberPersonКто забанен.
untilintegerили nullДо какого времени; null, пока не снимут.
createdAtintegerили nullС какого времени; null для банов до 2.16.
bystringили nullИмя того, кто забанил; null, если неизвестно.
Пример
{
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "until": 1759228800000,
  "createdAt": 1758624000000,
  "by": "Mara 🌻"
}

Until

Когда заканчивается заглушение или бан.

ПолеТипЗначение
untilintegerили nullМомент; null для бессрочного бана или снятого заглушения.
Пример
{
  "until": 1758624600000
}

Tag

Тег и сколько постов его несут.

ПолеТипЗначение
tagstringТег, без #.
postsintegerСколько недавних постов его несут.
Пример
{
  "tag": "garden",
  "posts": 58
}

SearchResult

Три списка, возможно пустых.

ПолеТипЗначение
postsPost[]Подходящие посты, сначала новые.
profilesProfileBrief[]Подходящие профили, по короткому имени.
tagsTag[]Подходящие теги, сначала самые используемые.
Пример
{
  "posts": [
    {
      "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "text": "The bees are back in the garden 🐝 #garden",
      "kind": "poll",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "verified": true,
        "accountKind": "person"
      },
      "community": {
        "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
        "name": "Urban Gardening"
      },
      "media": [
        {
          "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
          "kind": "image",
          "poster": null,
          "ai": "without"
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": null,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "giftDrop": {
        "item": "plan",
        "quantity": 3,
        "places": 10,
        "left": 4,
        "audience": "followers",
        "newAccounts": false,
        "status": "open",
        "claimed": true
      },
      "createdAt": 1758624000000
    }
  ],
  "profiles": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "tags": [
    {
      "tag": "garden",
      "posts": 58
    }
  ]
}

Emoji

Эмодзи этого сервера.

ПолеТипЗначение
namestringИмя, как оно стоит между двоеточиями.
urlstringАдрес картинки относительно этого сервера.
Пример
{
  "name": "tellmelo",
  "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
}

Notification

Уведомление. Одна строка может объединять несколько событий одного вида.

ПолеТипЗначение
idstringid уведомления.
kindstringЧто произошло.
  • reply — Кто-то тебе ответил.
  • like — Кому-то нравится твой пост.
  • reply_like — Кто-то голосует «за» твой ответ.
  • duel — Кто-то вызывает тебя на «Дуэль постов», или твой вызов сыгран.
  • reply_pick — Автор поста выделяет твой ответ.
  • repost — Кто-то репостнул твой пост.
  • follow — Кто-то на тебя подписался.
  • mention — Кто-то тебя упомянул.
  • group_mention — Кто-то упомянул группу, которую ты ведёшь; text — её название.
  • channel_mention — Кто-то упомянул тебя в чат-канале одной из твоих групп, в том числе через @everyone; участник указан как actor, в предложении названы канал и группа, но никогда не сообщение.
  • message — Кто-то написал тебе сообщение.
  • scheduled — Твой запланированный пост опубликован.
  • video — Твой пост, ждавший своё видео, вышел или снова стал черновиком.
  • reminder — Пора напоминания о сохранённом посте.
  • report — Что стало с жалобой, которую ты отправил.
  • moderation — Решение по твоему аккаунту: предупреждение, ограничение, обжалование.
  • team — Новая работа для команды (только владельцы, админы и модераторы).
  • reward — Награда за приглашение скоро истечёт или истекла.
  • gift — Подарок от команды: тариф или искры для тебя или для группы, которую ты ведёшь.
  • present — Подарок от участника: искры или время тарифа; участник — это actor.
  • spark — Искры скоро истекают, или группе, которой ты руководишь, больше не хватает искр на бонусы.
  • loyalty — О ритме верности: активная неделя засчитана или не хватает одного дня, награда новая или скоро пропадёт.
  • impact — Как прошли твои посты за двенадцать часов через сутки, в одном уведомлении.
  • discovery — Приглашение в программу «Находка» или сообщение о начале или конце места в ней.
  • group_post — Новый пост в группе, колокольчик которой на это настроен.
  • group_moderation — Руководство группы удалило твой пост или тебя из группы.
  • group — Действие участника в группе, касающееся тебя: пригласил(а), принял(а) или отклонил(а), сделал(а) соадминистратором, передал(а) или распустил(а) группу либо подал(а) заявку в твою группу; участник — это actor, название группы стоит в конце предложения.
  • coauthor — Кто-то пригласил тебя соавтором поста.
  • partner — Напоминание партнёрской программы или снятие значка партнёра.
  • news — Новая статья в регионе, на который ты подписан(а).
  • pick — Твой пост претендует на звание поста недели или года — или уже победил.
  • advent — Открыто новое окошко адвент-календаря, окошко открыто или сегодняшнее ещё ждёт.
  • team_message — Сообщение, которое команда tellmelo написала выбранным участникам.
  • challenge — Начался новый челлендж недели.
  • nudge — Один раз: пост, на который ещё никто не ответил, или текущий челлендж.
  • signin — Компьютер спрашивает, входишь ли ты на нём прямо сейчас.
textstringили nullТолько для жалоб и модерации: связанный текст, иначе null.
actorActorКто это сделал.
postIdstringили nullПост, о котором речь (null, если ни о каком).
readbooleanОтмечено ли прочитанным.
moreintegerСколько ещё событий представляет эта строка, кроме названного.
createdAtintegerКогда это произошло впервые.
updatedAtintegerКогда к нему в последний раз добавилось событие. Список отсортирован по этому полю.
Пример
{
  "id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
  "kind": "like",
  "text": null,
  "actor": {
    "handle": "jon",
    "name": "Jon"
  },
  "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "read": false,
  "more": 2,
  "createdAt": 1758624300000,
  "updatedAt": 1758624900000
}

Actor

Кто вызвал уведомление.

ПолеТипЗначение
handlestringКороткое имя.
namestringОтображаемое имя.
Пример
{
  "handle": "jon",
  "name": "Jon"
}

Conversation

Одна строка твоего ящика.

ПолеТипЗначение
withstringid другого аккаунта: то, что ждёт /conversations/{with}/messages.
handlestringЕго короткое имя.
namestringЕго отображаемое имя.
excerptstringили nullНачало последнего сообщения (null, если в нём нет текста).
truncatedbooleanОбрезан ли отрывок.
fromMebooleanТвоё ли последнее сообщение.
lastMessageIdstringid последнего сообщения.
unreadintegerСколько его сообщений ты ещё не прочитал.
updatedAtintegerКогда написано последнее сообщение.
Пример
{
  "with": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "excerpt": "See you on Saturday at the market!",
  "truncated": false,
  "fromMe": true,
  "lastMessageId": "7c6b5a49-3827-4165-9f0e-d1c2b3a49586",
  "unread": 0,
  "updatedAt": 1758624060000
}

Message

Сообщение в переписке.

ПолеТипЗначение
idstringid сообщения.
textstringили nullТекст (null для сообщения только из картинок).
fromstringid аккаунта, который его написал.
tostringid аккаунта, которому оно написано.
readbooleanПрочитал ли его получатель.
mediaMedia[]Его изображения; пусто, если их нет.
replyTostringили nullid сообщения, на которое отвечает это (null, если ни на какое). С 2.2.
createdAtintegerКогда отправлено.
Пример
{
  "id": "7c6b5a49-3827-4165-9f0e-d1c2b3a49586",
  "text": "See you on Saturday at the market!",
  "from": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "to": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "read": true,
  "media": [],
  "replyTo": null,
  "createdAt": 1758624060000
}

PlannedMessage

Твоё сообщение, запланированное на потом.

ПолеТипЗначение
idstringid запланированного сообщения.
tostringid аккаунта-получателя.
textstringили nullТекст, null при сквозном шифровании.
sendAtintegerКогда оно будет отправлено.
statestringЕго состояние.
  • waiting — Ждёт своего времени.
  • held — Задержано, потому что подписка закончилась. Можно отправить его самому или удалить.
  • failed — Не удалось отправить.
Пример
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "text": "Happy birthday! 🎂",
  "sendAt": 1758710400000,
  "state": "waiting"
}

ScheduledPost

Твой пост, который ещё не вышел.

ПолеТипЗначение
idstringid поста.
textstringили nullТекст.
communityIdstringили nullГруппа, в которой он выйдет (null вне групп).
publishAtintegerили nullКогда он выйдет (null, пока он ждёт чего-то другого).
deleteAtintegerили nullКогда он удалится сам (null – никогда).
waitingForstringЧего он ждёт.
  • time — Своего времени.
  • review — Одобрения текста, написанного на проверку.
  • check — Проверки автоматической модерацией.
  • payment — Оплаты своих подарков.
createdAtintegerКогда он написан.
Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "text": "Market day tomorrow – see you at the bee stand! #garden",
  "communityId": null,
  "publishAt": 1758710400000,
  "deleteAt": null,
  "waitingFor": "time",
  "createdAt": 1758624000000
}

Collection

Подборка сохранённых постов.

ПолеТипЗначение
idstringid подборки.
namestringЕё название.
countintegerСколько в ней постов.
Пример
{
  "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
  "name": "Recipes",
  "count": 12
}

Event

Предстоящее событие профиля.

ПолеТипЗначение
idstringid события.
titlestringНазвание.
startsAtintegerНачало.
endsAtintegerили nullКонец, null без конца.
placestringили nullМесто.
descriptionstringили nullОписание.
signupsEventSignupsили nullЗапись, null без записи.
Пример
{
  "id": "2a3b4c5d-6e7f-4809-9a1b-2c3d4e5f6a7b",
  "title": "Seed swap",
  "startsAt": 1758883200000,
  "endsAt": 1758890400000,
  "place": "Community garden",
  "description": "Bring seeds, take seeds.",
  "signups": {
    "count": 14,
    "going": true
  }
}

EventSignups

Сколько человек записалось.

ПолеТипЗначение
countintegerЧисло записавшихся.
goingbooleanЗаписан ли ты.
Пример
{
  "count": 14,
  "going": true
}

EventSignup

Тот, кто записался на твоё событие.

ПолеТипЗначение
idstringid аккаунта.
handlestringИмя пользователя.
namestringОтображаемое имя.
atintegerКогда записался.
Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "at": 1758624000000
}

Picture

Загруженное изображение.

ПолеТипЗначение
idstringid изображения.
urlstringГде его можно увидеть.
Пример
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

EmojiPicture

Загруженное изображение эмодзи.

ПолеТипЗначение
idstringid изображения.
urlstringГде его можно увидеть.
animatedbooleanАнимировано ли оно.
Пример
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

OwnEmoji

Один из твоих эмодзи.

ПолеТипЗначение
namestringЕго имя.
urlstringЕго изображение.
animatedbooleanАнимирован ли он.
restingbooleanОтдыхает, потому что подписка сейчас позволяет меньше эмодзи: он остаётся, но недоступен.
Пример
{
  "name": "sunflower",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false,
  "resting": false
}

GroupEmoji

Эмодзи группы.

ПолеТипЗначение
namestringЕго имя.
urlstringЕго изображение.
animatedbooleanАнимирован ли он.
Пример
{
  "name": "seedling",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

BotEvent

Событие в одной из групп бота.

ПолеТипЗначение
idstringЕго номер, по возрастанию; с ним продолжают (since, Last-Event-ID).
typestringЧто произошло.
  • message.created — Написано сообщение.
  • message.deleted — Удалено сообщение.
  • member.joined — Кто-то вступил.
  • member.left — Кто-то ушёл или был удалён.
  • voice.joined — Кто-то вошёл в голосовой канал.
  • command — Кто-то использовал команду бота.
  • interaction — Кто-то нажал кнопку в сообщении бота.
communitystringГруппа.
channelstringили nullКанал; null для всей группы.
createdAtintegerКогда это произошло.
dataobjectЧто к нему относится, по типу: message, member (с reason), command или interaction.
Пример
{
  "id": "4711",
  "type": "message.created",
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "channel": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
  "createdAt": 1758634800000,
  "data": {
    "message": {
      "id": "61a2b3c4-d5e6-4f70-8192-a3b4c5d6e7f8",
      "text": "/dice 6",
      "author": {
        "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
        "handle": "mara",
        "name": "Mara 🌻",
        "bot": false
      },
      "media": 0,
      "replyTo": null,
      "threadOf": null,
      "createdAt": 1758634800000
    }
  }
}

BotCommand

Команда бота.

ПолеТипЗначение
namestringЕё имя, без «/».
descriptionstringЧто она делает.
Пример
{
  "name": "dice",
  "description": "Rolls a die"
}

VoiceSeat

Место в голосовом канале.

ПолеТипЗначение
urlstringАдрес медиасервера (LiveKit).
tokenstringТокен для этого канала, действует несколько минут.
iceServersobject[]Серверы STUN и TURN для соединения.
speakbooleanМожет ли бот передавать туда звук.
videobooleanМожет ли бот передавать туда видео.
Пример
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Webhook

Один из твоих вебхуков.

ПолеТипЗначение
idstringid вебхука.
urlstringЕго адрес.
kindsstring[]О чём ему сообщают.
activebooleanПолучает ли он доставки. После многих неудач подряд отключается.
lastStatusintegerили nullHTTP-статус последней доставки.
lastAtintegerили nullКогда была последняя доставка.
failuresintegerНеудачи подряд.
Пример
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "url": "https://example.org/tellmelo-hook",
  "kinds": [
    "reply",
    "mention"
  ],
  "active": true,
  "lastStatus": 200,
  "lastAt": 1758624000000,
  "failures": 0
}

WebhookCreated

Новый вебхук с его секретом.

ПолеТипЗначение
idstringid вебхука.
secretstringСекрет для подписей, только в этот раз.
Пример
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

GroupBot

Бот группы.

ПолеТипЗначение
idstringid аккаунта бота.
handlestringЕго короткое имя.
namestringЕго имя.
descriptionstringЧто он делает, словами владельца.
permissionsstring[]Что разрешает его роль в группе.
Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "gardenbot",
  "name": "Garden bot",
  "description": "Reminds the group of watering days.",
  "permissions": [
    "send",
    "view"
  ]
}

VoiceRoom

Голосовой канал с людьми в нём.

ПолеТипЗначение
channelstringid канала.
peopleVoicePerson[]Кто сейчас в нём.
Пример
{
  "channel": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a",
  "people": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "muted": false,
      "deaf": false,
      "camera": false,
      "screen": true
    }
  ]
}

VoicePerson

Кто-то в голосовом канале.

ПолеТипЗначение
idstringid аккаунта.
handlestringКороткое имя.
namestringОтображаемое имя.
mutedbooleanВыключен ли микрофон.
deafbooleanНе слышит ли человек ничего (сам так решил).
camerabooleanВключена ли камера.
screenbooleanПоказывает ли экран.
Пример
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "muted": true,
  "deaf": false,
  "camera": false,
  "screen": false
}

GiftDrop

Подарки под постом – никогда с именами тех, кто их забрал.

ПолеТипЗначение
itemstringЧто входит в место.
  • plan — Месяцы тарифа (Сторонник).
  • sparks — Искры.
quantityintegerСколько в каждом месте: месяцев или искр.
placesintegerСколько всего мест.
leftintegerСколько ещё свободно.
audiencestringКто может забрать.
  • all — Все.
  • followers — Только подписчики того, кто раздаёт.
  • group — Только участники группы поста.
newAccountsbooleanМогут ли забирать аккаунты младше 7 дней.
statusstringСостояние.
  • awaiting_payment — Ждёт оплаты; пост ещё не вышел.
  • open — Места ещё можно забрать.
  • closed — Всё: места разобраны, оплата возвращена или пост удалён.
claimedbooleanЕсть ли место у тебя самого (на публичных путях всегда false).
Пример
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": true
}

OwnGiftDrop

Твои подарки под постом, с постом и способом оплаты.

Все поля GiftDrop, а также:

ПолеТипЗначение
postIdstringПост, под которым они стоят.
fundingstringКак они оплачены.
  • free — Бесплатно.
  • quota — Из квоты.
  • payment — Оплачено.
createdAtintegerКогда они созданы.
Пример
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": false,
  "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota",
  "createdAt": 1758624000000
}

Quota

Что лежит в квоте.

ПолеТипЗначение
monthsintegerМесяцы тарифа, которые ещё можно подарить.
sparksintegerИскры, которые ещё можно подарить.
looksQuotaLook[]Оформления в запасе, которые ещё можно подарить (с 2.13).
Пример
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

QuotaLook

Оформление в запасе партнёра с оставшимся количеством штук (с 2.13).

ПолеТипЗначение
idstringID оформления; при подарке передавай его как itemId.
namestringНазвание оформления.
kindstringВид оформления.
  • frame — Рамка профиля.
  • background — Эффект обложки.
  • card — Карточка профиля.
quantityintegerСколько штук осталось.
Пример
{
  "id": "frame-gold",
  "name": "Goldring",
  "kind": "frame",
  "quantity": 25
}

QuotaGift

Подарок из квоты.

ПолеТипЗначение
itemstringЧто подарено.
  • plan — Месяцы тарифа (Сторонник).
  • sparks — Искры.
  • shop — Оформление из запаса (с 2.13).
quantityintegerСколько.
itemIdstringили nullПодаренное оформление, если item — shop; иначе null.
recipientActorКому.
createdAtintegerКогда.
Пример
{
  "item": "plan",
  "quantity": 3,
  "itemId": null,
  "recipient": {
    "handle": "jon",
    "name": "Jon"
  },
  "createdAt": 1758627600000
}

MediaItem

GIF или видео из медиатеки (с 2.14).

ПолеТипЗначение
idstringID; для media при публикации.
kindstringGIF или видео.
  • gif — GIF в виде беззвучного зацикленного MP4.
  • video — Видео в MP4, со звуком.
namestringНазвание.
keywordsstringКлючевые слова строчными буквами.
widthintegerШирина в пикселях.
heightintegerВысота в пикселях.
secondsintegerДлина в секундах; у GIF — 0.
urlstringФайл MP4 относительно этого инстанса. Загружай его с ключом в заголовке.
posterstringПревью, тоже с ключом.
uploaderActorКто загрузил.
minebooleanТвоё ли это.
sharedbooleanДоступно ли всем в tellmelo.
anywherebooleanМожет ли появляться и на других сайтах.
embedEmbedили nullАдреса для других сайтов; null, пока там это не разрешено.
Пример
{
  "id": "b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "gif",
  "name": "Happy bees",
  "keywords": "bees garden happy",
  "width": 480,
  "height": 270,
  "seconds": 0,
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "poster": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918&poster=1",
  "uploader": {
    "handle": "mara",
    "name": "Mara 🌻"
  },
  "mine": false,
  "shared": true,
  "anywhere": true,
  "embed": {
    "page": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
    "file": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/file",
    "poster": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/poster",
    "code": "<iframe src=\"https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918\" width=\"480\" height=\"300\" title=\"Happy bees\" style=\"border:0;max-width:100%\" loading=\"lazy\" allowfullscreen></iframe>"
  }
}

Embed

Адреса для других сайтов. Работают без ключа.

ПолеТипЗначение
pagestringПлеер для <iframe>.
filestringФайл MP4 для своего плеера.
posterstringПревью.
codestringГотовый код для вставки.
Пример
{
  "page": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "file": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/file",
  "poster": "https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918/poster",
  "code": "<iframe src=\"https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918\" width=\"480\" height=\"300\" title=\"Happy bees\" style=\"border:0;max-width:100%\" loading=\"lazy\" allowfullscreen></iframe>"
}

UploadStarted

Начатая загрузка.

ПолеТипЗначение
uploadstringID этой загрузки.
pieceintegerМаксимальный размер фрагмента в байтах.
Пример
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

UploadPiece

Полученный фрагмент.

ПолеТипЗначение
receivedintegerСколько байт получено.
itemMediaItemили nullПосле последнего фрагмента — новое GIF или видео, иначе null.
Пример
{
  "received": 4194304,
  "item": null
}

Created

Ответ записи, которая что-то создала.

ПолеТипЗначение
idstringid созданного.
scheduledForintegerили nullКогда оно появится, если публикация запланирована (иначе null).
deleteAtintegerили nullКогда оно само удалится, если это задано (иначе null).
Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

DropCreated

Ответ, когда создан пост с подарками.

ПолеТипЗначение
idstringid нового поста.
fundingstringКак оплачены подарки.
  • free — Бесплатно.
  • quota — Из квоты.
Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Made

Что только что создано или изменено.

ПолеТипЗначение
idstringid; у ссылки-приглашения — её код.
Пример
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Ok

Ответ записи, которой нечего вернуть.

ПолеТипЗначение
okbooleanВсегда true.
Пример
{
  "ok": true
}

Машиночитаемое описание

Таблица, на которой построена эта страница, доступна как OpenAPI по адресу https://api.tellmelo.com/v2/openapi.json.

https://api.tellmelo.com/v2/openapi.json

GIF и видео на других сайтах

То, чем участник поделился и что разрешил на других сайтах, может показать любой сайт: поиск с anywhere=true находит это, а в его embed есть адреса. Если участник отзовёт разрешение, там всё исчезнет в течение нескольких минут.

Загрузка фрагментами

Сначала начни загрузку, потом отправляй файл фрагментами. Большой файл раздели на фрагменты по piece байт, с offset на месте каждого. После последнего фрагмента придёт готовое GIF или видео.

curl -X POST -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"kind":"gif","size":2400000,"name":"Happy bees","shared":true,"anywhere":true}' \
  "https://api.tellmelo.com/v2/media/uploads"
→ { "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b", "piece": 4194304 }

curl -X PUT -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @bees.gif \
  "https://api.tellmelo.com/v2/media/uploads/e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b?offset=0"
→ { "received": 2400000, "item": { "id": "…", "embed": { … } } }

Встраивание

Плеер показывает GIF по кругу или видео с элементами управления, под ним — название и кто поделился. Вставь код из embed.code на страницу:

<iframe src="https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918" width="480" height="300" title="Happy bees" style="border:0;max-width:100%" loading="lazy" allowfullscreen></iframe>

Форумы и программы, которые знают oEmbed, сами получают код, если дать им адрес плеера:

https://tellmelo.com/api/oembed?url=https%3A%2F%2Ftellmelo.com%2Fmedia-embed%2Fb2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918

Ключ должен быть на твоём сервере, никогда не в коде веб-страницы. Ищи и загружай через свой сервер; адресам в embed ключ не нужен.

Выбор GIF для твоего сайта

С ключом сайта (Раздел для разработчиков → Выбор GIF для твоего сайта) твой сайт получает готовый поиск: две строки на странице, и клик по кнопке открывает его. Ключ публичный и работает только на адресах, которые ты для него укажешь. Выбор GIF показывает только то, что участники разрешили для других сайтов.

<script src="https://tellmelo.com/picker.js" data-key="tmsk_…" defer></script>
<button type="button" data-tellmelo-picker>GIF</button>

При выборе кнопка отправляет событие tellmelo:pick с элементом: code для встраивания, file, poster, name и author. С data-target="#field" она сразу вставляет code в текстовое поле, с data-kind="video" ищет видео. Если встраиваешь файл сам, покажи имя человека, который им поделился.

document.addEventListener('tellmelo:pick', (event) => {
  const { code, file, name, author } = event.detail;
});

Вход через tellmelo

Другие сайты позволяют участникам входить через аккаунт tellmelo по OpenID Connect (код авторизации с PKCE). Сайт получает только имя пользователя, подтверждённый адрес эл. почты и собственный идентификатор для каждого участника (sub).

Заявку на приложение ты подаёшь в разделе «Раздел для разработчиков → Вход через tellmelo». Команда проверяет каждое приложение; после этого там виден ID клиента, а для приложений с сервером ты создаёшь секрет клиента, который показывается один раз.

Всё, что нужно библиотеке, есть в документе обнаружения:

https://tellmelo.com/.well-known/openid-configuration
  1. Отправь участника на /oauth/authorize с response_type=code, client_id, redirect_uri (точно как зарегистрирован), scope=openid profile email, state, nonce и code_challenge с code_challenge_method=S256.
  2. Обменяй код в течение минуты в /oauth/token: grant_type=authorization_code, code, redirect_uri и code_verifier; приложения с сервером дополнительно передают секрет через Basic-авторизацию или в форме.
  3. ID-токен (RS256, ключи по адресу /oauth/jwks) содержит sub, с profile ещё preferred_username, с email ещё email и email_verified. Токен доступа действует 10 минут и читает только /oauth/userinfo.
https://tellmelo.com/oauth/authorize?response_type=code&client_id=tm_…
  &redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&scope=openid%20profile%20email
  &state=…&nonce=…&code_challenge=…&code_challenge_method=S256

curl -u "tm_…:tms_…" https://tellmelo.com/oauth/token \
  -d grant_type=authorization_code -d code=… \
  -d redirect_uri=https://example.com/callback -d code_verifier=…
{
  "iss": "https://example.social",
  "sub": "Xq3vR0b8yJm1cW4tZ2kPn6sLd9fHa7gE5uTo0iBeVxY",
  "aud": "tm_5f2c9e1a7b3d4c6e8f0a1b2c",
  "iat": 1760432400,
  "exp": 1760433000,
  "nonce": "n-0S6_WzA2Mj",
  "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
  "preferred_username": "anna",
  "email": "anna@example.com",
  "email_verified": true
}

Токенов обновления нет: tellmelo выполняет вход и не даёт постоянного доступа. Если участник убирает сайт или команда приостанавливает приложение, /oauth/userinfo сразу отвечает 401. prompt=none проверяет без страницы, prompt=consent спрашивает заново.

Чего мы ждём

Действуют те же правила, что и везде: никакой травли, никакого спама, никакого контента, на который у тебя нет прав. За то, что публикует твой ключ, отвечаешь ты.

Показывай GIF и видео других на своём сайте, только если у них есть embed, через эти адреса и с именем того, кто ими поделился. Если что-то больше недоступно, перестань это показывать. Не копируй файлы в собственную коллекцию.

Выходные данныеКонфиденциальностьУсловия использованияСтатусПриложения