tellmelotellmelo.
Выходные данныеКонфиденциальностьУсловия использованияСообщить о нарушении авторских правКонтактыAPIПриложения

API

Это перевод. Обязательной является версия на немецком языке. Там, где этот текст от неё отличается, действует немецкий текст. Язык можно переключить внизу страницы.

Начало

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

Основы

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

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

  • Конечные точки
  • Вход
    • GET /
  • Посты
    • GET /posts
    • GET /posts/{id}
    • POST /posts
    • DELETE /posts/{id}
  • Ответы
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
  • Опросы
    • POST /posts/{id}/vote
  • Профили
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
  • Группы
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
  • Обзор
    • GET /tags
    • GET /search
    • GET /emojis
  • Твой аккаунт
    • GET /me
    • GET /feed
  • Уведомления
    • GET /notifications
    • POST /notifications/read
  • Сообщения
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
  • Связи
    • POST /relations

Объекты

  • Объекты
  • Service
  • RateLimit
  • Post
  • Reply
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • Created
  • Ok

Ещё

  • Машиночитаемое описание
  • Чего мы ждём
Содержание

Начало

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

Основы

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

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

  • Конечные точки
  • Вход
    • GET /
  • Посты
    • GET /posts
    • GET /posts/{id}
    • POST /posts
    • DELETE /posts/{id}
  • Ответы
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
  • Опросы
    • POST /posts/{id}/vote
  • Профили
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
  • Группы
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
  • Обзор
    • GET /tags
    • GET /search
    • GET /emojis
  • Твой аккаунт
    • GET /me
    • GET /feed
  • Уведомления
    • GET /notifications
    • POST /notifications/read
  • Сообщения
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
  • Связи
    • POST /relations

Объекты

  • Объекты
  • Service
  • RateLimit
  • Post
  • Reply
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • Created
  • Ok

Ещё

  • Машиночитаемое описание
  • Чего мы ждём

Обзор

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

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

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

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

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

Попробовать

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

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

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

Твой ключ

Один ключ на аккаунт. Он начинается с tm_key_ и показывается только один раз. Потерял? Создай новый; старый перестанет работать.

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

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

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

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

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

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

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

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

У ключа одно из двух прав, и у каждого пути ниже указано, какое ему нужно:

  • read: чтение. Публичные посты, профили, группы и теги, а также твоя лента, уведомления и сообщения.
  • write: действия. Публиковать, отвечать, голосовать, отправлять сообщения, подписываться, вступать, блокировать, отмечать уведомления прочитанными.

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

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

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

  • 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://tellmelo.com/api/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Твоему аккаунту это нельзя, например из-за отозванного права или блокировки.
404unknown_pathТакого пути нет или нет с этим методом.
404not_foundНе найдено, или тебе нельзя это видеть.
409conflictКонфликтует с уже существующим, например имя занято.
413too_largeСлишком велико для этого сервера.
422unprocessableЧитается, но в таком виде невозможно.
429rate_limitedСлишком много запросов. Ничего не произошло; подожди и попробуй снова.
500internal_errorНа сервере что-то пошло не так.

Версии

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

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

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

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

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

ПутьПравоДля чего
Вход
GET/api/v2readВерсия API и название этого сервера.
Посты
GET/api/v2/postsreadПубличные посты, сначала новые.
GET/api/v2/posts/{id}readОдин пост по его id.
POST/api/v2/postswriteОпубликовать пост.
DELETE/api/v2/posts/{id}writeУдалить один из своих постов.
Ответы
GET/api/v2/posts/{id}/repliesreadОтветы на пост, без заблокированных аккаунтов.
POST/api/v2/posts/{id}/replieswriteОтветить на пост.
Опросы
POST/api/v2/posts/{id}/votewriteПринять участие в опросе.
Профили
GET/api/v2/profiles/{handle}readПрофиль по его короткому имени.
GET/api/v2/profiles/{handle}/postsreadПубличные посты одного профиля, сначала новые.
Группы
GET/api/v2/communitiesreadОткрытые группы этого сервера.
GET/api/v2/communities/{id}readОдна группа по её id.
GET/api/v2/communities/{id}/postsreadПубличные посты одной группы, сначала новые.
Обзор
GET/api/v2/tagsreadТеги, которые сейчас в ходу.
GET/api/v2/searchreadПоиск по постам, именам, коротким именам и тегам.
GET/api/v2/emojisreadСобственные эмодзи сервера с адресами их картинок.
Твой аккаунт
GET/api/v2/mereadТвой собственный профиль с id, который ждут остальные пути.
GET/api/v2/feedreadТвоя собственная лента в том виде, как её собирает приложение.
Уведомления
GET/api/v2/notificationsreadТвои уведомления, сначала новые.
POST/api/v2/notifications/readwriteОтметить уведомления прочитанными.
Сообщения
GET/api/v2/conversationsreadТвой ящик: по строке на переписку, сначала самая свежая.
GET/api/v2/conversations/{with}/messagesreadСообщения одной переписки, сначала новые.
POST/api/v2/conversations/{with}/messageswriteОтправить сообщение в переписку.
POST/api/v2/conversations/{with}/readwriteОтметить все сообщения переписки прочитанными.
Связи
POST/api/v2/relationswriteОтметить, сохранить, репостнуть, подписаться, вступить, заблокировать, скрыть — в зависимости от kind.

Вход

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

GET/api/v2

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

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

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

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

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

Ответ

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

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

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

Посты

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

GET/api/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://tellmelo.com/api/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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

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

GET/api/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://tellmelo.com/api/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
    }
  ],
  "poll": {
    "options": [
      {
        "text": "Lavender",
        "votes": 12
      },
      {
        "text": "Sunflowers",
        "votes": 7
      },
      {
        "text": "Clover",
        "votes": 3
      }
    ],
    "total": 22,
    "multiple": false,
    "endsAt": 1758710400000,
    "running": true,
    "resultsVisible": true,
    "myVotes": [
      0
    ]
  },
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 4,
    "likes": 31,
    "reposts": 2
  },
  "pinned": false,
  "createdAt": 1758624000000
}

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

POST/api/v2/posts

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

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

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

Прикреплять изображения через API пока нельзя, только в приложении.

Параметры

ИмяТипЗначение
textв телеstringнеобязательноТекст поста, ответа или сообщения.
communityв телеstringнеобязательноid группы, в которую идёт пост. Без него — вне всех групп.
quotesв телеstringнеобязательноid поста, который цитирует этот.
pollв теле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://tellmelo.com/api/v2/posts"

Ответ

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

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

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

DELETE/api/v2/posts/{id}

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

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

Параметры

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

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

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

Ответ

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

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

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

Ответы

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

GET/api/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://tellmelo.com/api/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,
      "createdAt": 1758624600000,
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "parentId": null
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

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

POST/api/v2/posts/{id}/replies

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

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

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

Параметры

ИмяТипЗначение
idв путиstringобязательноid поста.
textв телеstringобязательноТекст поста, ответа или сообщения.
parentIdв телеstringнеобязательноid ответа, на который отвечает этот. Без него — прямо к посту.

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

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

Ответ

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

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

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

Опросы

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

POST/api/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://tellmelo.com/api/v2/posts/5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1/vote"

Ответ

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

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

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

Профили

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

GET/api/v2/profiles/{handle}

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

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

Параметры

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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/api/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://tellmelo.com/api/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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

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

Группы

Открытые группы и их посты.

GET/api/v2/communities

Открытые группы этого сервера.

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

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

Параметры

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

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

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

Ответ

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

Пример
{
  "items": [
    {
      "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
      "name": "Urban Gardening",
      "description": "Balconies, allotments, rooftops: whatever grows.",
      "tags": [
        "garden",
        "bees"
      ],
      "members": 312,
      "joinPolicy": "open",
      "visibility": "open"
    }
  ],
  "next": null
}

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

GET/api/v2/communities/{id}

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

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

Параметры

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

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

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

Ответ

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

Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "description": "Balconies, allotments, rooftops: whatever grows.",
  "tags": [
    "garden",
    "bees"
  ],
  "members": 312,
  "joinPolicy": "open",
  "visibility": "open"
}

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

GET/api/v2/communities/{id}/posts

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

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

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

Параметры

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

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

Обзор

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

GET/api/v2/tags

Теги, которые сейчас в ходу.

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

Не больше 10 популярных тегов по весу: каждое использование даёт 1 и вдвое уменьшается каждые 3 дня, один аккаунт даёт не больше 3 в день. posts — округлённый вес. limit только укорачивает список. Теги, выделенные командой, могут стоять выше.

Параметры

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

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

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

Ответ

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

Пример
{
  "items": [
    {
      "tag": "garden",
      "posts": 58
    }
  ],
  "next": null
}

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

GET/api/v2/search

Поиск по постам, именам, коротким именам и тегам.

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

Ищет только публичное: посты вне групп, профили и теги. limit действует для каждого вида.

Параметры

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "createdAt": 1758624000000
    }
  ],
  "profiles": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "tags": [
    {
      "tag": "garden",
      "posts": 58
    }
  ]
}

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

GET/api/v2/emojis

Собственные эмодзи сервера с адресами их картинок.

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

В текстах эмодзи выглядит как :name:. Замени его картинкой из этого списка; неизвестные имена остаются текстом.

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

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

Ответ

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

Пример
{
  "items": [
    {
      "name": "tellmelo",
      "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
    }
  ],
  "next": null
}

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

Твой аккаунт

Твой профиль и твоя лента.

GET/api/v2/me

Твой собственный профиль с id, который ждут остальные пути.

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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/api/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://tellmelo.com/api/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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "createdAt": 1758624000000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

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

Уведомления

Что происходило вокруг твоего аккаунта, страница за страницей.

GET/api/v2/notifications

Твои уведомления, сначала новые.

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

Чтение ничего не отмечает прочитанным; это делает POST /notifications/read. События одного вида на одном посте делят строку; more говорит, сколько их.

Параметры

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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/api/v2/notifications/read

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

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

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

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

Ответ

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

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

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

Сообщения

Твой ящик и переписки. Переписка называется по другому аккаунту.

GET/api/v2/conversations

Твой ящик: по строке на переписку, сначала самая свежая.

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

Параметры

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

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

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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/api/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://tellmelo.com/api/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/api/v2/conversations/{with}/messages

Отправить сообщение в переписку.

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

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

Прикреплять изображения через 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://tellmelo.com/api/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages"

Ответ

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

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

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

POST/api/v2/conversations/{with}/read

Отметить все сообщения переписки прочитанными.

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

Параметры

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

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

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/read"

Ответ

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

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

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

Связи

Отметить, сохранить, репостнуть, подписаться, вступить, заблокировать: один путь, ставится и снимается через active.

POST/api/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://tellmelo.com/api/v2/relations"

Ответ

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

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

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

Объекты

Все объекты, поле за полем. [] означает список.

Service

Ответ корня: кто отвечает и что может этот ключ.

ПолеТипЗначение
namestringВсегда tellmelo.
versionstringВерсия API, например 2.1.
scopestringЧто может этот ключ: read или read write.
rateLimitRateLimitБюджет этого ключа.
docsstringГде эта документация, в виде пути на этом сервере.
specstringГде машиночитаемое описание.
Пример
{
  "name": "tellmelo",
  "version": "2.10",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/legal/api",
  "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Закреплён ли он наверху профиля автора.
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
    }
  ],
  "poll": {
    "options": [
      {
        "text": "Lavender",
        "votes": 12
      },
      {
        "text": "Sunflowers",
        "votes": 7
      },
      {
        "text": "Clover",
        "votes": 3
      }
    ],
    "total": 22,
    "multiple": false,
    "endsAt": 1758710400000,
    "running": true,
    "resultsVisible": true,
    "myVotes": [
      0
    ]
  },
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 4,
    "likes": 31,
    "reposts": 2
  },
  "pinned": false,
  "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,
  "createdAt": 1758624600000,
  "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "parentId": null
}

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).
Пример
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null
}

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": 1758710400000,
  "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 — Автоматический аккаунт, например бот.
Пример
{
  "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Её название.
descriptionstringили nullОписание (null, если его нет).
tagsstring[]Темы, которым она посвящена.
membersintegerСколько в ней участников.
joinPolicystringКак в неё попасть.
  • open — Вступить может любой.
  • application — Для вступления нужна заявка, которую принимает группа.
  • invite — Только по приглашению.
visibilitystringЧерез ключ всегда open.
  • open — Видна всем.
Пример
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "description": "Balconies, allotments, rooftops: whatever grows.",
  "tags": [
    "garden",
    "bees"
  ],
  "members": 312,
  "joinPolicy": "open",
  "visibility": "open"
}

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
        }
      ],
      "poll": {
        "options": [
          {
            "text": "Lavender",
            "votes": 12
          },
          {
            "text": "Sunflowers",
            "votes": 7
          },
          {
            "text": "Clover",
            "votes": 3
          }
        ],
        "total": 22,
        "multiple": false,
        "endsAt": 1758710400000,
        "running": true,
        "resultsVisible": true,
        "myVotes": [
          0
        ]
      },
      "quotes": null,
      "continues": null,
      "counts": {
        "replies": 4,
        "likes": 31,
        "reposts": 2
      },
      "pinned": false,
      "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 — Кому-то нравится твой ответ.
  • repost — Кто-то репостнул твой пост.
  • follow — Кто-то на тебя подписался.
  • mention — Кто-то тебя упомянул.
  • group_mention — Кто-то упомянул группу, которую ты ведёшь; text — её название.
  • message — Кто-то написал тебе сообщение.
  • scheduled — Твой запланированный пост опубликован.
  • reminder — Пора напоминания о сохранённом посте.
  • report — Что стало с жалобой, которую ты отправил.
  • moderation — Решение по твоему аккаунту: предупреждение, ограничение, обжалование.
  • team — Новая работа для команды (только владельцы, админы и модераторы).
  • reward — Награда за приглашение скоро истечёт или истекла.
  • gift — Подарок от команды: тариф или искры для тебя или для группы, которую ты ведёшь.
  • present — Подарок от участника: искры или время тарифа; участник — это actor.
  • spark — Искры скоро закончатся, или группа, которую ты ведёшь, достигла уровня или удерживает его лишь на время.
  • loyalty — О ритме верности: активная неделя засчитана или не хватает одного дня, награда новая или скоро пропадёт.
  • impact — Как прошли твои посты за двенадцать часов через сутки, в одном уведомлении.
  • discovery — Приглашение в программу «Находка» или сообщение о начале или конце места в ней.
  • group_post — Новый пост в группе, колокольчик которой на это настроен.
  • group_moderation — Руководство группы удалило твой пост или тебя из группы.
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
}

Created

Ответ записи, которая что-то создала.

ПолеТипЗначение
idstringid созданного.
scheduledForintegerили nullКогда оно появится, если публикация запланирована (иначе null).
deleteAtintegerили nullКогда оно само удалится, если это задано (иначе null).
Пример
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

Ok

Ответ записи, которой нечего вернуть.

ПолеТипЗначение
okbooleanВсегда true.
Пример
{
  "ok": true
}

Машиночитаемое описание

Таблица, на которой построена эта страница, доступна как OpenAPI по адресу /api/v2/openapi.json.

https://tellmelo.com/api/v2/openapi.json

Чего мы ждём

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

Назад в tellmelo