tellmelo.DevelopersGo to tellmelo
Help CenterSupportLegalDevelopers

API

Getting started

  • I want to …
  • Overview
  • Quick start
  • Try it
  • Your key
  • What a key may do
  • Bots

Basics

  • Requests and answers
  • Pages
  • Only what is new
  • Limits
  • Headers
  • When something does not work
  • Versions

Endpoints

  • Endpoints
  • The way in
    • GET /
  • Posts
    • 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
  • Replies
    • 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}
  • Polls
    • POST /posts/{id}/vote
  • Profiles
    • 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
  • Groups
    • 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
  • Channels
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Running groups
    • 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}
  • Bots
    • GET /events
    • GET /events/stream
    • GET /me/commands
    • PUT /me/commands
    • POST /interactions/{id}/reply
    • POST /channels/{id}/voice
  • Discover
    • GET /tags
    • GET /search
    • GET /emojis
  • GIFs and videos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Your account
    • 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
  • Notifications
    • GET /notifications
    • POST /notifications/read
  • Messages
    • 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}
  • Relations
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Collections
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Gifts
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objects

  • Objects
  • 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

More

  • The machine-readable description
  • GIFs and videos on other websites
  • Sign in with tellmelo
  • What we expect
Contents

Getting started

  • I want to …
  • Overview
  • Quick start
  • Try it
  • Your key
  • What a key may do
  • Bots

Basics

  • Requests and answers
  • Pages
  • Only what is new
  • Limits
  • Headers
  • When something does not work
  • Versions

Endpoints

  • Endpoints
  • The way in
    • GET /
  • Posts
    • 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
  • Replies
    • 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}
  • Polls
    • POST /posts/{id}/vote
  • Profiles
    • 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
  • Groups
    • 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
  • Channels
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Running groups
    • 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}
  • Bots
    • GET /events
    • GET /events/stream
    • GET /me/commands
    • PUT /me/commands
    • POST /interactions/{id}/reply
    • POST /channels/{id}/voice
  • Discover
    • GET /tags
    • GET /search
    • GET /emojis
  • GIFs and videos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Your account
    • 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
  • Notifications
    • GET /notifications
    • POST /notifications/read
  • Messages
    • 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}
  • Relations
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Collections
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Gifts
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objects

  • Objects
  • 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

More

  • The machine-readable description
  • GIFs and videos on other websites
  • Sign in with tellmelo
  • What we expect

I want to …

Choose what you have in mind; below are only the steps for it. The full reference follows further down.

  1. Create the bot in one of your groups, in the group menu under “Bots → My bots”, with a picture, name and @name. You only see its token once.
  2. Share its “Add bot” link or submit it for the bot directory, where it appears once the team has checked it; anyone who may manage roles in a group takes it in with the permissions they agree to.
  3. Receive what happens in its groups as a stream (GET /v2/events/stream) or at your address, and write with POST /v2/channels/{id}/messages. More under Bots.
  4. Register commands (PUT /v2/me/commands) and answer with cards and buttons; a bot plays music with a seat in a voice channel (POST /v2/channels/{id}/voice).

Overview

v2 lets your own programs talk to tellmelo: one key per request, JSON back, every list pages the same way. The same rules apply as in the app.

  • Every path begins with https://api.tellmelo.com/v2.
  • Requests and answers are JSON in UTF-8. Field names, codes and values are English and stay English.
  • A key acts as your account: what you can’t see in the app, it can’t read either.
https://api.tellmelo.com/v2

Quick start

  1. Create a key under “Developer area → API” and copy it. It is shown only once.
  2. Call the root with it. The answer shows the version, the key’s rights and the requests left this minute.
  3. Every path works the same way: key in the header, JSON back, items and next for lists.
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"
}

Next: /me for your profile, /posts for public posts, /feed for your feed.

Try it

Pick a task, fill in the fields and copy the request or send it from here. Writing asks first. The code reads the key from TELLMELO_KEY.

read API version and name of this instance.

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

Your key

Up to 10 keys per account, each with a name, its own permissions and, if you like, an expiry date. A key begins with tm_key_ and is shown only once. Lost it? Renew it; the old value stops working.

You create it under “Developer area → API”. It travels in the header of the request:

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

Or, if that is more convenient, in a header of its own:

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

Not in the URL: it would end up in logs and browser history.

The same key loads images: every url points to /api/media; send the key in the header there too.

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

What a key may do

A key can always read and, if you allow it, also write, give gifts, upload media and run groups. Each path below says what it needs:

  • read: reading. Public posts, profiles, groups and tags, plus your feed, notifications, messages and the channels of your groups.
  • write: acting. Posting, replying, voting, sending messages, writing in a group chat, following, joining, blocking, marking notifications as read.
  • gifts: giving. From a partner’s quota to a member, and gifts under a new post. A separate permission, so a key meant for posting can never give anything away.
  • media: your own media library. Uploading, changing, sharing and removing GIFs and videos. A separate permission, because uploads cost the account’s video points. Finding shared GIFs and videos only needs read.
  • groups: running groups. Roles, channels, categories, invitation links, the feed channel, removals, timeouts, kicks and bans, as far as your account may in the group. A permission of its own, so a key for posting never changes who may do what in a group.

What no key can do

No key reaches password, email address, account type, place, role, deletion, sessions, push devices or other keys, nor the admin area or group leadership. What the password protects, no key can do.

Bots

A bot is an account of its own, of the kind bot, for groups: without a password or email address, run by your program with its own key. It uses the same API as every account and can do in groups whatever its role there allows.

  1. In one of your groups, open the group menu, go to “Bots → My bots” and create a bot with a picture, banner, name, username and description. The token is shown only once; it has the permissions read, write, media and groups.
  2. Pass on the bot's link, or submit it for the bot directory; it appears there once the team has checked it. Anyone who may manage roles in a group chooses the permissions; the bot joins and gets a role of its own.
  3. Your program sends the token as Authorization: Bearer …, reads the events of its groups as a stream and works with the routes under Bots, Channels and Groups.

A small bot that reads the events as a stream and answers the command /ping with pong, only for whoever asked:

// 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 });
    }
  }
}

The same bot in Python, fetching the events page by page:

# 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)
  • What a bot may do in a group is decided by its role there, not by the token. The role carries its name; the group changes its permissions under the roles in the group settings and removes the bot in the group menu under “Bots → In this group”.
  • Up to 5 bots per account; per group as many as its perks allow. A bot writes at most 30 messages a minute per group, can't be found through search and only writes to people who wrote to it first. The limits apply.
  • Events also arrive at an HTTPS address of your own (signed like the webhooks, with retries). On top: commands (PUT /v2/me/commands) with answers for everyone or only whoever asked, cards and buttons in messages, and music in voice channels (POST /v2/channels/{id}/voice): all under Bots.

Requests and answers

  • JSON everywhere. Every answer is application/json in UTF-8, errors included. Only images come as images.
  • What you send. A POST carries its fields as JSON in the body. If a field is also in the URL, the body wins.
  • Times are milliseconds since 1 January 1970, UTC.
  • IDs are strings. Compare them only as a whole.
  • Every field is always present. What’s missing is null; lists may be empty.
  • Texts are plain text, exactly as written. #tags, @names and links stay as they are, and so do the instance’s own emojis, as :name:; their pictures are listed under /emojis.
  • Images are relative addresses, /api/media?id=…. Without the key in the header you get 401.

Pages

Every list takes limit and cursor and answers with items and next. Send next back as cursor to get the next page; when next is empty, you are done. The cursor is opaque: don’t parse it, don’t build one.

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

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

Without limit, 20 entries, at most 50. Some lists don’t page; their next is always null.

Only what is new

Every answer carries an ETag. Send it back as If-None-Match next time: if nothing changed, you get 304 with no body.

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

Exceptions: /feed has no ETag because its order keeps changing, and writes never answer 304.

Limits

A key may make 120 requests per minute, 600 with the “Organisation” plan, unless the team sets otherwise. Above that you get 429 and nothing was carried out. Wait a minute and send the request again.

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

Writes also count against the app’s limits, such as how many posts in a few minutes. That too answers 429 with rate_limited.

Headers

Apart from the key, no header is required.

What you send

HeaderMeaning
AuthorizationCarries the key: Bearer tm_key_…. The usual way.
X-Tellmelo-KeyThe key, as an alternative to Authorization.
Content-Typeapplication/json, for a request with a body.
If-None-MatchThe ETag of the last answer. If nothing has changed since, the answer is 304 without a body.

What comes back

HeaderMeaning
ETagThis answer’s fingerprint (W/). Send it back as If-None-Match.
X-RateLimit-LimitHow many requests this key may make per minute.
X-RateLimit-RemainingHow many of them are left in the current minute.
X-RateLimit-ResetWhen the next minute begins, in seconds since 1970, UTC.
X-Tellmelo-ScopeWhat this key may do: read or read write.
Retry-AfterWith a 429: how many seconds to wait before asking again.
WWW-AuthenticateOn 401 without a key: Bearer.
Cache-Controlno-store: no proxy may cache an answer. You can still check it with the ETag.

When something does not work

Errors come as JSON: a fixed English code in error for your program and a sentence in message for people, plus the matching status code. Compare only the code; the sentence may change.

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

Some errors bring one more field: docs with a 401 for a missing key, limit with a 429.

StatusCodeMeaning
400bad_requestThe request can’t be read, a required field is missing, or a value isn’t allowed.
401key_missingNo key in the header.
401key_invalidThe key isn’t valid: mistyped, replaced, or the account is banned.
401unauthorizedRejected as not signed in, for a reason other than the key.
403scope_missingThe key lacks the required right, usually write.
403account_data_lockedAccount data such as password, email address or deletion is off limits to keys.
403forbiddenYour account may not do this, for example because of a revoked right or a block.
403timed_outA timeout mutes your account in this group right now.
404unknown_pathThere is no such path, or not with this method.
404not_foundNot found, or you may not see it.
409conflictIt collides with what is already there, for example a name that is taken.
409feed_offThis group’s feed channel is off.
413too_largeToo large for this instance.
422unprocessableReadable, but not possible in this form.
429rate_limitedToo many requests. Nothing happened; wait and try again.
500internal_errorSomething went wrong on the server.

Versions

The version is in the path. As long as it says v2, paths and fields stay the same; new things are only added.

Additions raise the second number. Every path says since when it exists.

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/ is gone: the old paths answer 410 and name the new way in the body.

Endpoints

All paths at a glance, then each one with an example.

PathRightWhat for
The way in
GET/v2readAPI version and name of this instance.
Posts
GET/v2/postsreadThe public posts, newest first.
GET/v2/posts/{id}readA single post, by its id.
POST/v2/postswritePublish a post.
DELETE/v2/posts/{id}writeRemove one of your own posts.
GET/v2/me/scheduledreadYour posts that aren’t out yet, and what they’re waiting for.
POST/v2/posts/{id}/schedulewriteChange when a scheduled post goes out, or when a post deletes itself.
POST/v2/posts/{id}/editwriteChange the text of one of your posts.
GET/v2/posts/{id}/reply-settingsreadWho may reply to your own post, whether replies wait for approval, and slow mode.
PUT/v2/posts/{id}/reply-settingswriteChange the reply settings of your own post. Whatever you leave out stays.
POST/v2/posts/{id}/coauthorwriteAccept or decline an invitation to co-author a post.
DELETE/v2/posts/{id}/coauthorwriteStep back as co-author, or as the author take the co-author off the post.
POST/v2/posts/{id}/pinwritePin your own post to the top of your profile, or unpin it.
Replies
GET/v2/posts/{id}/repliesreadThe replies to a post, without blocked accounts.
POST/v2/posts/{id}/replieswriteReply to a post.
POST/v2/replies/{id}/editwriteChange the text of one of your replies.
DELETE/v2/replies/{id}writeRemove one of your replies.
POST/v2/replies/{id}/likewriteUpvote a reply (a like is an upvote since replies are voted up and down), or take the upvote back; a downvote stays.
POST/v2/replies/{id}/votewriteVote a reply up or down, or take your vote back. Answers with your vote and the score after it.
POST/v2/replies/{id}/pickwriteHighlight a reply under your own post as the best one, or take the highlight back.
GET/v2/posts/{id}/replies/waitingreadThe replies waiting for approval under a post: all of them under your own post, otherwise only your own.
POST/v2/replies/{id}/decidewriteApprove or decline a waiting reply under your own post. A declined reply is deleted.
GET/v2/posts/{id}/replies/plannedreadYour own replies planned for later under a post.
PUT/v2/me/planned-replies/{id}writeChange the text or time of a planned reply. A failed one waits again afterwards.
POST/v2/me/planned-replies/{id}/sendwriteSend a planned reply right away.
DELETE/v2/me/planned-replies/{id}writeDelete a planned reply.
Polls
POST/v2/posts/{id}/votewriteTake part in a poll.
Profiles
GET/v2/profiles/{handle}readA profile, by its short name.
GET/v2/profiles/{handle}/postsreadThe public posts of one profile, newest first.
GET/v2/profiles/{handle}/eventsreadThe upcoming events of a profile, soonest first.
POST/v2/me/eventswriteCreate an event. Answers with its id.
PUT/v2/me/events/{id}writeChange one of your events. All fields are set anew.
DELETE/v2/me/events/{id}writeDelete one of your events.
GET/v2/me/events/{id}/signupsreadWho signed up for one of your events.
POST/v2/events/{id}/signupwriteSign up for an event or sign off.
Groups
GET/v2/communitiesreadThe open groups of this instance; with mine=true your account’s groups.
GET/v2/communities/{id}readA single group, by its id.
GET/v2/communities/{id}/postsreadThe posts of a group’s feed channel, newest first.
GET/v2/communities/{id}/membersreadThe members of a group with their roles.
GET/v2/communities/{id}/rolesreadThe roles of a group, the highest first, @everyone last.
GET/v2/communities/{id}/bellreadWhich notifications a group sends you.
GET/v2/invites/{code}readThe group behind an invitation link, before joining.
PUT/v2/roles/{id}/selfwriteTake or put down a self-assignable role.
GET/v2/communities/{id}/emojisreadA group's own emojis.
PUT/v2/communities/{id}/bellwriteSet which notifications a group sends you.
POST/v2/invites/{code}/joinwriteJoin a group with an invitation link.
GET/v2/communities/{id}/botsreadThe bots of a group with what their role allows.
Channels
GET/v2/communities/{id}/channelsreadThe channels of a group you can see, in their order.
GET/v2/channels/{id}/messagesreadThe messages of a chat channel, newest first.
POST/v2/channels/{id}/messageswriteWrite a message in a chat channel.
POST/v2/channels/{id}/readwriteMark a chat channel as read up to a point in time.
DELETE/v2/channel-messages/{id}writeDelete one of your messages in a chat channel.
GET/v2/communities/{id}/voicereadWho is in a group’s voice channels right now, per channel.
Running groups
POST/v2/communities/{id}/emojisgroupsGive the group an emoji.
DELETE/v2/communities/{id}/emojis/{name}groupsRemove an emoji from the group.
POST/v2/communities/{id}/rolesgroupsCreate a role.
PUT/v2/roles/{id}groupsChange a role’s name, colour and permissions.
DELETE/v2/roles/{id}groupsDelete a role.
PUT/v2/communities/{id}/roles/ordergroupsSet the rank of the roles.
PUT/v2/roles/{id}/members/{member}groupsGive a member a role or take it away.
POST/v2/communities/{id}/channelsgroupsCreate a chat channel.
PUT/v2/channels/{id}groupsChange a channel’s name, topic and category.
DELETE/v2/channels/{id}groupsDelete a chat channel with its messages.
PUT/v2/communities/{id}/channels/ordergroupsSet the order of the categories and chat channels.
PUT/v2/communities/{id}/channels/shapegroupsSet the shape of all the group’s channel symbols.
GET/v2/channels/{id}/overridesgroupsWhat roles may do differently in a channel than in the group.
PUT/v2/channels/{id}/overrides/{role}groupsSet what a role may do differently in a channel.
POST/v2/communities/{id}/categoriesgroupsCreate a category for channels.
PUT/v2/categories/{id}groupsRename a category.
DELETE/v2/categories/{id}groupsDelete a category.
PUT/v2/communities/{id}/feedgroupsSwitch a group’s feed channel on or off.
GET/v2/communities/{id}/invitesgroupsA group’s invitation links that still work.
POST/v2/communities/{id}/invitesgroupsCreate an invitation link.
DELETE/v2/invites/{code}groupsTake back an invitation link.
POST/v2/channel-messages/{id}/removegroupsRemove another member’s message from a channel.
POST/v2/communities/{id}/posts/{post}/removegroupsRemove a post from a group.
DELETE/v2/communities/{id}/members/{member}groupsKick a member from a group.
PUT/v2/communities/{id}/members/{member}/timeoutgroupsMute a member.
DELETE/v2/communities/{id}/members/{member}/timeoutgroupsLift a timeout.
GET/v2/communities/{id}/bansgroupsA group's running bans.
PUT/v2/communities/{id}/bans/{member}groupsBan a member.
DELETE/v2/communities/{id}/bans/{member}groupsLift a ban.
GET/v2/communities/{id}/loggroupsThe leadership’s log: who removed what and why.
POST/v2/communitiesgroupsFound a group. Answers with its id; you are its founder.
PUT/v2/communities/{id}groupsChange a group you lead. Whatever you leave out stays.
Bots
GET/v2/eventsreadThe events from the bot's groups since an event, page by page.
GET/v2/events/streamreadThe events from the bot's groups as they happen (server-sent events).
GET/v2/me/commandsreadThe bot's commands.
PUT/v2/me/commandswriteSet the bot's commands, all at once.
POST/v2/interactions/{id}/replywriteAnswer a command or a button.
POST/v2/channels/{id}/voicewriteTake a seat in a voice channel to play music or sound.
Discover
GET/v2/tagsreadThe tags that are trending right now.
GET/v2/searchreadA search over posts, names, short names and tags.
GET/v2/emojisreadThe instance’s own emojis, with the address of their pictures.
GIFs and videos
GET/v2/mediareadShared GIFs or videos, most used first.
GET/v2/media/minemediaYour own media library, newest first.
GET/v2/media/{id}readA GIF or video, yours or a shared one.
POST/v2/media/uploadsmediaStart an upload.
PUT/v2/media/uploads/{upload}mediaSend a piece of the file.
POST/v2/media/{id}mediaChange one of your GIFs or videos.
DELETE/v2/media/{id}mediaRemove one of your GIFs or videos.
Your account
GET/v2/mereadYour own profile, with the id the other paths expect.
GET/v2/feedreadYour own feed, the way the application puts it together.
POST/v2/me/pictureswriteUpload a picture, as its bytes. Answers with id and url; you then use the id as profile picture, banner or in a post.
PUT/v2/me/profileprofileChange your profile: name, about, profile picture, banner and profile colour. Whatever you leave out stays.
GET/v2/me/emojisreadYour own emojis.
POST/v2/me/emojis/picturesprofileUpload the picture for an own emoji, as its bytes.
POST/v2/me/emojisprofileCreate an own emoji. Answers with all your emojis.
DELETE/v2/me/emojis/{name}profileRemove an own emoji. Answers with the rest.
PUT/v2/me/emojis/sharingprofileSet whether your followers may use your emojis in their own texts.
GET/v2/me/webhookswebhooksYour webhooks with their state.
POST/v2/me/webhookswebhooksCreate a webhook. Answers with id and the secret for the signatures, this once only.
DELETE/v2/me/webhooks/{id}webhooksDelete a webhook.
POST/v2/me/webhooks/{id}/testwebhooksSend a test to a webhook.
Notifications
GET/v2/notificationsreadYour notifications, newest first.
POST/v2/notifications/readwriteMark your notifications as read.
Messages
GET/v2/conversationsreadYour inbox: one row per conversation, the most recent first.
GET/v2/conversations/{with}/messagesreadThe messages of one conversation, newest first.
POST/v2/conversations/{with}/messageswriteSend a message in a conversation.
POST/v2/conversations/{with}/readwriteMark every message of a conversation as read.
DELETE/v2/conversations/{with}/messages/{id}writeDelete one of your messages.
POST/v2/conversations/{with}/plannedwritePlan a message for later. Answers with the id of the planned message.
GET/v2/me/planned-messagesreadYour own messages still to be sent, in order of their time.
POST/v2/me/planned-messages/{id}/sendwriteSend a held or failed planned message now.
DELETE/v2/me/planned-messages/{id}writeDelete a planned message before it is sent.
Relations
POST/v2/relationswriteLike, save, repost, follow, join, block, mute, depending on kind.
GET/v2/profiles/{handle}/followersreadWho follows a profile, newest first.
GET/v2/profiles/{handle}/followingreadWhom a profile follows, newest first.
GET/v2/me/relationsreadWhom you blocked, muted, or blocked from messaging only, newest first.
Collections
GET/v2/me/collectionsreadYour collections with the number of their posts.
POST/v2/me/collectionswriteCreate a collection. Answers with its id.
PUT/v2/me/collections/{id}writeRename a collection.
DELETE/v2/me/collections/{id}writeDelete a collection.
GET/v2/me/collections/{id}/postsreadThe posts of a collection, as in the saved tab.
POST/v2/me/collections/{id}/postswritePut a post into a collection or take it out.
Gifts
GET/v2/partner/quotareadWhat’s left in your quota to give away.
GET/v2/partner/giftsreadWhat you’ve given from your quota, to whom and when – newest first.
POST/v2/partner/giftsgiftsGive plan months or sparks from your quota to a member.
GET/v2/gift-dropsreadYour gifts under posts: how many places are still open and how they were paid for.
POST/v2/gift-dropsgiftsPublish a post with gifts for others to claim.

The way in

The first request of every program: does the key work, and what may it do?

GET/v2

API version and name of this instance.

  • Right read
  • with ETag
  • since v2.0

Without a slash at the end: https://api.tellmelo.com/v2/ redirects to https://api.tellmelo.com/v2 with 308, and not every program follows.

Example request

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

Answer

Answers with one Service.

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

Possible statuses: 200304401429

Posts

Reading public posts, publishing your own and removing them again.

GET/v2/posts

The public posts, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

On public paths, counts.likes and counts.reposts are always 0 and pinned is false.

Posts in groups aren’t here but under /communities/{id}/posts.

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Post, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304401429

GET/v2/posts/{id}

A single post, by its id.

  • Right read
  • with ETag
  • since v2.0

On public paths, counts.likes and counts.reposts are always 0 and pinned is false.

Posts in groups aren’t here but under /communities/{id}/posts.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with one Post.

Example
{
  "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
}

Possible statuses: 200304400401404429

POST/v2/posts

Publish a post.

  • Right write
  • since v2.0

A post needs text or a poll. Length, poll options and pace are set by the instance; beyond that you get 400 or 429.

Attach images, a GIF or a video with media. A GIF or video stands alone. You may use other members’ shared GIFs and videos on tellmelo.

A post for close friends or with a co-author goes out right away, not in a group and not scheduled. You can’t do both at once.

Parameters

NameTypeMeaning
textin the bodystringoptionalThe text of the post, reply or message.
communityin the bodystringoptionalThe id of the group whose feed channel the post goes to; it must be on, and you need the permission for it. Without it the post stands outside any group.
quotesin the bodystringoptionalThe id of the post this one quotes.
pollin the bodystring[]optionalThe answer options as a list of texts.
mediain the bodystring[]optionalIDs of images uploaded in the app, or of a GIF or video from the media library (since 2.14).
audiencein the bodystringoptionalWho sees the post: everyone who may see it, close only your close friends.everyoneclose
coauthorin the bodystringoptionalThe id of an account you invite as co-author. You must follow each other.

Example request

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"

Answer

Answers with one Created.

Example
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

Possible statuses: 200400401403429

DELETE/v2/posts/{id}

Remove one of your own posts.

  • Right write
  • since v2.0

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/me/scheduled

Your posts that aren’t out yet, and what they’re waiting for.

  • Right read
  • with ETag
  • since v2.12

Example request

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

Answer

Answers with a page of ScheduledPost, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304401429

POST/v2/posts/{id}/schedule

Change when a scheduled post goes out, or when a post deletes itself.

  • Right write
  • since v2.12

Your own posts only. While a post’s gifts aren’t paid for, it can’t be scheduled.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
publishAtin the bodyintegeroptionalWhen the scheduled post goes out, in milliseconds since 1970.
deleteAtin the bodyintegeroptionalWhen the post deletes itself, in milliseconds since 1970.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/posts/{id}/edit

Change the text of one of your posts.

  • Right write
  • since v2.12

Only within the editing window your plan gives you. Scheduled posts can’t be edited.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
textin the bodystringrequiredThe text of the post, reply or message.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Who may reply to your own post, whether replies wait for approval, and slow mode.

  • Right read
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with one ReplySettings.

Example
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Possible statuses: 200304400401404429

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

Change the reply settings of your own post. Whatever you leave out stays.

  • Right write
  • since v2.19

Your own posts only.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
audiencein the bodystringoptionalWho may reply: everyone, accounts you follow, those mentioned, or nobody.allfollowingmentionednobody
approvalin the bodybooleanoptionalWhether replies only appear once you approve them.
slowin the bodystringoptionalSlow mode: auto turns it on by itself when many replies come in, on always, off never.autoonoff

Example request

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"

Answer

Answers with one ReplySettings.

Example
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Possible statuses: 200400401403404429

POST/v2/posts/{id}/coauthor

Accept or decline an invitation to co-author a post.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
acceptin the bodybooleanrequiredtrue accepts the invitation, false declines it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/posts/{id}/coauthor

Step back as co-author, or as the author take the co-author off the post.

  • Right write
  • since v2.19

For the co-author and the author of the post.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/posts/{id}/pin

Pin your own post to the top of your profile, or unpin it.

  • Right write
  • since v2.19

Only your own visible posts. How many can be pinned depends on the plan.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
activein the bodybooleanrequiredtrue pins the post, false unpins it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Replies

Replies under a post, as a list with parentId.

GET/v2/posts/{id}/replies

The replies to a post, without blocked accounts.

  • Right read
  • pageable
  • with ETag
  • since v2.0

The list is flat and in order of writing; parentId turns it into a tree. A page always holds whole threads. Replies from blocked accounts are left out.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Reply, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401404429

POST/v2/posts/{id}/replies

Reply to a post.

  • Right write
  • since v2.0

In slow mode, one reply per person every 10 minutes, otherwise 429. The author and accounts they follow are exempt.

With media at most one image, GIF or video.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
textin the bodystringrequiredThe text of the post, reply or message.
parentIdin the bodystringoptionalThe id of the reply this one answers. Without it, straight to the post.
mediain the bodystring[]optionalIDs of images uploaded in the app, or of a GIF or video from the media library (since 2.14).
publishAtin the bodyintegeroptionalWhen the reply should go out, in milliseconds since 1970. Without it, it goes out right away.

Example request

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"

Answer

Answers with one Created.

Example
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

Possible statuses: 200400401403404429

POST/v2/replies/{id}/edit

Change the text of one of your replies.

  • Right write
  • since v2.12

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.
textin the bodystringrequiredThe text of the post, reply or message.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/replies/{id}

Remove one of your replies.

  • Right write
  • since v2.12

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/replies/{id}/like

Upvote a reply (a like is an upvote since replies are voted up and down), or take the upvote back; a downvote stays.

  • Right write
  • since v2.12
  • deprecated

Deprecated since 2.19: use POST /replies/{id}/vote. This route stays for now.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.
activein the bodybooleanrequiredtrue sets the relation, false removes it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/replies/{id}/vote

Vote a reply up or down, or take your vote back. Answers with your vote and the score after it.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.
votein the bodystringrequiredup votes up, down votes down, none takes your vote back.updownnone

Example request

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"

Answer

Answers with one ReplyVote.

Example
{
  "vote": "up",
  "score": 12
}

Possible statuses: 200400401403404429

POST/v2/replies/{id}/pick

Highlight a reply under your own post as the best one, or take the highlight back.

  • Right write
  • since v2.19

Only under your own posts, and only replies directly to the post. A new highlight replaces the old one.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.
activein the bodybooleanrequiredtrue highlights the reply, false takes the highlight back.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

The replies waiting for approval under a post: all of them under your own post, otherwise only your own.

  • Right read
  • with ETag
  • since v2.19

Whether replies wait is set by the author in the reply settings.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with a page of Reply, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

POST/v2/replies/{id}/decide

Approve or decline a waiting reply under your own post. A declined reply is deleted.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the reply.
approvein the bodybooleanrequiredtrue approves the reply, false declines it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Your own replies planned for later under a post.

  • Right read
  • with ETag
  • since v2.19

You plan a reply with publishAt when replying. At most 20 planned replies at a time.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.

Example request

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

Answer

Answers with a page of PlannedReply, as `items` and `next`.

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

Possible statuses: 200304400401404429

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

Change the text or time of a planned reply. A failed one waits again afterwards.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the planned reply.
textin the bodystringoptionalThe text of the post, reply or message.
publishAtin the bodyintegeroptionalWhen the reply should go out, in milliseconds since 1970. Without it, it goes out right away.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Send a planned reply right away.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the planned reply.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Delete a planned reply.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the planned reply.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Polls

A poll is a post whose poll is set. Voting has a path of its own.

POST/v2/posts/{id}/vote

Take part in a poll.

  • Right write
  • since v2.0

Votes per option are null until you have voted or the poll ends. total is always there.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a post.
optionin the bodyintegerrequiredWhich option, counted from 0. For multiple choice, call once per option.
retractin the bodybooleanoptionaltrue withdraws the vote.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Profiles

Public profiles by their short name, and what they have posted.

GET/v2/profiles/{handle}

A profile, by its short name.

  • Right read
  • with ETag
  • since v2.0

Parameters

NameTypeMeaning
handlein the pathstringrequiredThe short name of a profile, in any mix of capitals.

Example request

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

Answer

Answers with one Profile.

Example
{
  "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
}

Possible statuses: 200304400401404429

GET/v2/profiles/{handle}/posts

The public posts of one profile, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

On public paths, counts.likes and counts.reposts are always 0 and pinned is false.

Posts in groups aren’t here but under /communities/{id}/posts.

Parameters

NameTypeMeaning
handlein the pathstringrequiredThe short name of a profile, in any mix of capitals.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Post, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401404429

GET/v2/profiles/{handle}/events

The upcoming events of a profile, soonest first.

  • Right read
  • with ETag
  • since v2.19

Only while the profile’s plan includes events. Nothing between accounts that blocked each other.

Parameters

NameTypeMeaning
handlein the pathstringrequiredThe short name of a profile, in any mix of capitals.

Example request

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

Answer

Answers with a page of Event, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

POST/v2/me/events

Create an event. Answers with its id.

  • Right write
  • since v2.19

Needs a plan with events, otherwise 403. How many can be upcoming depends on the plan.

Parameters

NameTypeMeaning
titlein the bodystringrequiredThe title.
startsAtin the bodyintegerrequiredStart, in milliseconds since 1970.
endsAtin the bodyintegeroptionalEnd, in milliseconds since 1970. Optional.
placein the bodystringoptionalWhere it takes place.
descriptionin the bodystringoptionalA description.
signupsin the bodybooleanoptionalWhether people can sign up. Needs a plan with sign-ups.
capacityin the bodyintegeroptionalHow many can sign up at most. Without it, no limit.

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403429

PUT/v2/me/events/{id}

Change one of your events. All fields are set anew.

  • Right write
  • since v2.19

An event that has already started keeps its start.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the event.
titlein the bodystringrequiredThe title.
startsAtin the bodyintegerrequiredStart, in milliseconds since 1970.
endsAtin the bodyintegeroptionalEnd, in milliseconds since 1970. Optional.
placein the bodystringoptionalWhere it takes place.
descriptionin the bodystringoptionalA description.
signupsin the bodybooleanoptionalWhether people can sign up. Needs a plan with sign-ups.
capacityin the bodyintegeroptionalHow many can sign up at most. Without it, no limit.

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

DELETE/v2/me/events/{id}

Delete one of your events.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the event.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Who signed up for one of your events.

  • Right read
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the event.

Example request

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

Answer

Answers with a page of EventSignup, as `items` and `next`.

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

Possible statuses: 200304400401404429

POST/v2/events/{id}/signup

Sign up for an event or sign off.

  • Right write
  • since v2.19

Only for events with sign-ups, not your own. When it is full, 409.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the event.
goingin the bodybooleanrequiredtrue signs you up, false signs you off.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Groups

The open groups and your own, their posts, members, roles and invitation links.

GET/v2/communities

The open groups of this instance; with mine=true your account’s groups.

  • Right read
  • with ETag
  • since v2.0

Sorted by member count and not paged; next is always null.

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
minein the querybooleanoptionaltrue for your account’s groups, internal and hidden ones too, by name.

Example request

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

Answer

Answers with a page of Community, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304401429

GET/v2/communities/{id}

A single group, by its id.

  • Right read
  • with ETag
  • since v2.0

Internal and hidden groups only when your account is a member.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with one Community.

Example
{
  "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
  }
}

Possible statuses: 200304400401404429

GET/v2/communities/{id}/posts

The posts of a group’s feed channel, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

On public paths, counts.likes and counts.reposts are always 0 and pinned is false.

If the feed channel is off, the path answers 409 with feed_off.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Post, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401404429

GET/v2/communities/{id}/members

The members of a group with their roles.

  • Right read
  • with ETag
  • since v2.15

The leadership first, then by highest role; at most 300.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of GroupMember, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

GET/v2/communities/{id}/roles

The roles of a group, the highest first, @everyone last.

  • Right read
  • with ETag
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of Role, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

GET/v2/communities/{id}/bell

Which notifications a group sends you.

  • Right read
  • with ETag
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with one Bell.

Example
{
  "level": "important"
}

Possible statuses: 200304400401404429

GET/v2/invites/{code}

The group behind an invitation link, before joining.

  • Right read
  • with ETag
  • since v2.15

Parameters

NameTypeMeaning
codein the pathstringrequiredThe code of an invitation link, the end of its address.

Example request

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

Answer

Answers with one InvitePreview.

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

Possible statuses: 200304400401404429

PUT/v2/roles/{id}/self

Take or put down a self-assignable role.

  • Right write
  • since v2.20

Only roles the leadership offers as self-assignable (selfable), and only for your own account.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a role.
activein the bodybooleanoptionalfalse takes the role away; otherwise it is given.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/emojis

A group's own emojis.

  • Right read
  • with ETag
  • since v2.20

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of GroupEmoji, as `items` and `next`.

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

Possible statuses: 200304400401404429

PUT/v2/communities/{id}/bell

Set which notifications a group sends you.

  • Right write
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
levelin the bodystringrequiredWhich notifications come.allimportantoff

Example request

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"

Answer

Answers with one Bell.

Example
{
  "level": "important"
}

Possible statuses: 200400401403404429

POST/v2/invites/{code}/join

Join a group with an invitation link.

  • Right write
  • since v2.15

Parameters

NameTypeMeaning
codein the pathstringrequiredThe code of an invitation link, the end of its address.
rulesin the bodybooleanoptionaltrue if you accept the group’s rules; needed when it has any.

Example request

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

Answer

Answers with one Joined.

Example
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/bots

The bots of a group with what their role allows.

  • Right read
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of GroupBot, as `items` and `next`.

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

Possible statuses: 200304400401404429

Channels

The channels of your groups and their chat: reading, writing, marking as read.

GET/v2/communities/{id}/channels

The channels of a group you can see, in their order.

  • Right read
  • with ETag
  • since v2.15

The feed channel (kind: feed) is only here while it is on; its posts come through /communities/{id}/posts.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of Channel, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

GET/v2/channels/{id}/messages

The messages of a chat channel, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.15

Up to 50 messages a page. Messages of accounts you blocked or that blocked you are left out.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.
threadin the querystringoptionalThe message whose thread is read: it and its replies instead of the chat.

Example request

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

Answer

Answers with a page of ChannelMessage, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401404429

POST/v2/channels/{id}/messages

Write a message in a chat channel.

  • Right write
  • since v2.15

@name notifies a member, @everyone with the permission for it everyone, at most six times an hour.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.
textin the bodystringoptionalThe text of the post, reply or message.
replyToin the bodystringoptionalThe id of the message in the same channel you are answering.
mediain the bodystring[]optionalIDs of images uploaded in the app, or of a GIF or video from the media library (since 2.14).
threadin the bodystringoptionalThe chat message whose thread is replied in; without it the message goes into the chat.
cardin the bodyobjectoptionalA card { title, text, color, fields: [{ name, value }] }, at most 10 fields.
buttonsin the bodyobject[]optionalUp to 5 buttons, each { id, label, style } with style primary, secondary or danger. A press arrives as an interaction event.

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

POST/v2/channels/{id}/read

Mark a chat channel as read up to a point in time.

  • Right write
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.
atin the bodyintegerrequiredUp to when it is read, in milliseconds, usually the createdAt of the newest message.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/channel-messages/{id}

Delete one of your messages in a chat channel.

  • Right write
  • since v2.15

Only your own messages; others’ messages are removed by the leadership with the groups permission.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a message in a chat channel.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/voice

Who is in a group’s voice channels right now, per channel.

  • Right read
  • with ETag
  • since v2.19

Only channels you may see. Without a media server, the list is empty.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of VoiceRoom, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401404429

Running groups

What a group’s settings can do in the app, with the groups permission. What your account may do is decided by the group as in the app: leadership, roles and their rank.

POST/v2/communities/{id}/emojis

Give the group an emoji.

  • Right groups
  • since v2.20

Only who may manage the group's channels. The picture is uploaded like one of your own emojis (POST /me/emojis/pictures); a name is taken only once across all emojis.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the bodystringrequiredThe name you write the emoji with, as :name:.
picturein the bodystringrequiredThe id from POST /me/emojis/pictures.

Example request

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"

Answer

Answers with a page of GroupEmoji, as `items` and `next`.

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

Possible statuses: 200400401403404429

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

Remove an emoji from the group.

  • Right groups
  • since v2.20

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the pathstringrequiredThe name of the emoji, without colons.

Example request

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

Answer

Answers with a page of GroupEmoji, as `items` and `next`.

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

Possible statuses: 200400401403404429

POST/v2/communities/{id}/roles

Create a role.

  • Right groups
  • since v2.15

Only roles below your own highest and only permissions you have yourself; the leadership stands above all.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the bodystringoptionalThe role’s name; @everyone keeps its own.
colorin the bodystringoptionalThe colour; empty for none.indigovioletroseambergreenteal
permissionsin the bodystring[]optionalThe permissions: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfablein the bodybooleanoptionaltrue: members take the role themselves. Only for roles that allow no more than taking part (view, send, attach, voice_connect, voice_speak, voice_video).

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

PUT/v2/roles/{id}

Change a role’s name, colour and permissions.

  • Right groups
  • since v2.15

Replaces name, colour and permissions; what you leave out becomes empty.

Only roles below your own highest and only permissions you have yourself; the leadership stands above all.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a role.
namein the bodystringoptionalThe role’s name; @everyone keeps its own.
colorin the bodystringoptionalThe colour; empty for none.indigovioletroseambergreenteal
permissionsin the bodystring[]optionalThe permissions: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfablein the bodybooleanoptionaltrue: members take the role themselves. Only for roles that allow no more than taking part (view, send, attach, voice_connect, voice_speak, voice_video).

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

DELETE/v2/roles/{id}

Delete a role.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a role.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Set the rank of the roles.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
rolesin the bodystring[]requiredThe ids of all roles below your own highest, the highest first; for the leadership all except @everyone.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Give a member a role or take it away.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a role.
memberin the pathstringrequiredThe id of a member’s account.
activein the bodybooleanoptionalfalse takes the role away; otherwise it is given.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/communities/{id}/channels

Create a chat channel.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the bodystringoptionalThe name, without #; empty for the name the app gives in each language.
topicin the bodystringoptionalThe topic shown above the channel.
categoryin the bodystringoptionalThe id of the category the channel goes into; empty for none.
emojiin the bodystringoptionalAn emoji as the symbol.
iconin the bodystringoptionalA symbol of the app’s set, by its name.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagein the bodystringoptionalThe id of a picture you uploaded with /media/emoji.
colorin the bodystringoptionalThe tile’s colour.brandindigovioletroseambergreentealred
shapein the bodystringoptionalThe tile’s shape; a circle without one.circlesquaretrianglediamondhexagonoctagonshieldstar

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

PUT/v2/channels/{id}

Change a channel’s name, topic and category.

  • Right groups
  • since v2.15

Replaces name, topic and category; what you leave out becomes empty.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.
namein the bodystringoptionalThe name, without #; empty for the name the app gives in each language.
topicin the bodystringoptionalThe topic shown above the channel.
categoryin the bodystringoptionalThe id of the category the channel goes into; empty for none.
emojiin the bodystringoptionalAn emoji as the symbol.
iconin the bodystringoptionalA symbol of the app’s set, by its name.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagein the bodystringoptionalThe id of a picture you uploaded with /media/emoji.
colorin the bodystringoptionalThe tile’s colour.brandindigovioletroseambergreentealred
shapein the bodystringoptionalThe tile’s shape; a circle without one.circlesquaretrianglediamondhexagonoctagonshieldstar

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

DELETE/v2/channels/{id}

Delete a chat channel with its messages.

  • Right groups
  • since v2.15

The feed channel cannot be deleted, only switched off.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Set the order of the categories and chat channels.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
categoriesin the bodystring[]requiredThe ids of all the group’s categories in their new order.
channelsin the bodystring[]requiredThe ids of all the group’s chat channels in their new order.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Set the shape of all the group’s channel symbols.

  • Right groups
  • since v2.20

The group’s leadership only.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
shapein the bodystringoptionalThe shape of all the group’s symbols; left out, each channel has its own.circlesquaretrianglediamondhexagonoctagonshieldstar

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/channels/{id}/overrides

What roles may do differently in a channel than in the group.

  • Right groups
  • with ETag
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.

Example request

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

Answer

Answers with a page of ChannelOverride, as `items` and `next`.

Example
{
  "items": [
    {
      "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
      "allow": [
        "send"
      ],
      "deny": []
    }
  ],
  "next": null
}

Possible statuses: 200304400401403404429

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

Set what a role may do differently in a channel.

  • Right groups
  • since v2.15

Not for roles at or above your own highest.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.
rolein the pathstringrequiredThe id of a role.
allowin the bodystring[]optionalWhat the role may do here as well: in a chat view, send, attach, mention_everyone, moderate, in the feed channel view and post_feed.
denyin the bodystring[]optionalWhat the role may not do here, from the same permissions. Both lists empty remove the difference.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/communities/{id}/categories

Create a category for channels.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the bodystringrequiredThe category’s name.
emojiin the bodystringoptionalAn emoji as the symbol.
iconin the bodystringoptionalA symbol of the app’s set, by its name.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagein the bodystringoptionalThe id of a picture you uploaded with /media/emoji.
colorin the bodystringoptionalThe tile’s colour.brandindigovioletroseambergreentealred

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

PUT/v2/categories/{id}

Rename a category.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a category.
namein the bodystringrequiredThe category’s name.
emojiin the bodystringoptionalAn emoji as the symbol.
iconin the bodystringoptionalA symbol of the app’s set, by its name.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagein the bodystringoptionalThe id of a picture you uploaded with /media/emoji.
colorin the bodystringoptionalThe tile’s colour.brandindigovioletroseambergreentealred

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

DELETE/v2/categories/{id}

Delete a category.

  • Right groups
  • since v2.15

Its channels stay, without a category.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a category.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

PUT/v2/communities/{id}/feed

Switch a group’s feed channel on or off.

  • Right groups
  • since v2.15

Off, the posts stay stored but only their authors can see them.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
onin the bodybooleanrequiredtrue switches the feed channel on, false off.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/invites

A group’s invitation links that still work.

  • Right groups
  • with ETag
  • since v2.15

The leadership sees all, everyone else only their own.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of InviteLink, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401403404429

POST/v2/communities/{id}/invites

Create an invitation link.

  • Right groups
  • since v2.15

A link works only as long as you may invite, and goes when you leave.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
daysin the bodyintegeroptionalHow many days the link works; without it, until it is taken back.1730
usesin the bodyintegeroptionalHow often the link can be used; without it, any number of times.151025100

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

DELETE/v2/invites/{code}

Take back an invitation link.

  • Right groups
  • since v2.15

Parameters

NameTypeMeaning
codein the pathstringrequiredThe code of an invitation link, the end of its address.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Remove another member’s message from a channel.

  • Right groups
  • since v2.15

Logged in the group’s log and at most 60 an hour, as in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a message in a chat channel.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Remove a post from a group.

  • Right groups
  • since v2.15

Logged in the group’s log and at most 60 an hour, as in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
postin the pathstringrequiredThe id of a post.
reasonin the bodystringrequiredThe reason the member reads.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Kick a member from a group.

  • Right groups
  • since v2.15

A kick since 2.16: the member can join again. Whoever should stay out is banned.

Only with the permission for it and only for members below your own highest role; co-managers only as the founder.

Logged in the group’s log and at most 60 an hour, as in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
memberin the pathstringrequiredThe id of a member’s account.
reasonin the bodystringrequiredThe reason the member reads.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Mute a member.

  • Right groups
  • since v2.16

A new timeout replaces one running. Leaving and joining again does not end it.

Only with the permission for it and only for members below your own highest role; co-managers only as the founder.

Logged in the group’s log and at most 60 an hour, as in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
memberin the pathstringrequiredThe id of a member’s account.
secondsin the bodyintegerrequiredHow long, in seconds.60300600360086400604800
reasonin the bodystringoptionalA reason the member reads; optional.

Example request

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"

Answer

Answers with one Until.

Example
{
  "until": 1758624600000
}

Possible statuses: 200400401403404429

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

Lift a timeout.

  • Right groups
  • since v2.16

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
memberin the pathstringrequiredThe id of a member’s account.

Example request

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"

Answer

Answers with one Until.

Example
{
  "until": 1758624600000
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/bans

A group's running bans.

  • Right groups
  • with ETag
  • since v2.16

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of Ban, as `items` and `next`.

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

Possible statuses: 200304400401403404429

PUT/v2/communities/{id}/bans/{member}

Ban a member.

  • Right groups
  • since v2.16

Without days the ban lasts until it is lifted.

Only with the permission for it and only for members below your own highest role; co-managers only as the founder.

Logged in the group’s log and at most 60 an hour, as in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
memberin the pathstringrequiredThe id of a member’s account.
daysin the bodyintegeroptionalHow long, in days; leave it out for a ban without an end.1730
reasonin the bodystringrequiredThe reason the member reads.

Example request

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"

Answer

Answers with one Until.

Example
{
  "until": 1758624600000
}

Possible statuses: 200400401403404429

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

Lift a ban.

  • Right groups
  • since v2.16

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
memberin the pathstringrequiredThe id of a member’s account.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/communities/{id}/log

The leadership’s log: who removed what and why.

  • Right groups
  • with ETag
  • since v2.15

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.

Example request

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

Answer

Answers with a page of LogEntry, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304400401403404429

POST/v2/communities

Found a group. Answers with its id; you are its founder.

  • Right groups
  • since v2.19

Needs the permission groups. Without saying, the group is internal and free to join; a hidden one by invitation only. Whether members may found groups is up to the operator.

Parameters

NameTypeMeaning
namein the bodystringrequiredThe name, at most 60 characters.
descriptionin the bodystringoptionalThe description, at most 240 characters.
handlein the bodystringoptionalThe handle for @# mentions and the link: 3 to 30 lowercase letters, digits or _.
tagsin the bodystring[]optionalUp to 5 #tags, what the group is about.
joinPolicyin the bodystringoptionalHow people join: open freely, application by applying, invite by invitation only.openapplicationinvite
visibilityin the bodystringoptionalWho sees the group: open everyone, internal only members its content, hidden only members at all.openinternalhidden

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403429

PUT/v2/communities/{id}

Change a group you lead. Whatever you leave out stays.

  • Right groups
  • since v2.19

Needs the permission groups and the group’s leadership. Leadership, dissolving and spark perks stay in the app.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a group.
namein the bodystringoptionalThe name, at most 60 characters.
descriptionin the bodystringoptionalThe description, at most 240 characters.
handlein the bodystringoptionalThe handle for @# mentions and the link: 3 to 30 lowercase letters, digits or _.
tagsin the bodystring[]optionalUp to 5 #tags, what the group is about.
joinPolicyin the bodystringoptionalHow people join: open freely, application by applying, invite by invitation only.openapplicationinvite
visibilityin the bodystringoptionalWho sees the group: open everyone, internal only members its content, hidden only members at all.openinternalhidden
imagein the bodystringoptionalThe id of an uploaded picture (POST /me/pictures) as the group picture. Empty removes it.
bannerin the bodystringoptionalThe id of an uploaded picture as the group’s banner. Empty removes it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Bots

What happens in a bot's groups, in real time: as a stream, page by page, or delivered to an address.

GET/v2/events

The events from the bot's groups since an event, page by page.

  • Right read
  • since v2.20

Only with a bot's token. A channel's events only if the bot may see it.

Events are kept for a day. next is the number of the last one, as since for the next page.

Parameters

NameTypeMeaning
sincein the querystringoptionalThe number of the last event the bot already has. Without it, the stream starts now and the list at the oldest.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/events?since=0"

Answer

Answers with a page of BotEvent, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200401429

GET/v2/events/stream

The events from the bot's groups as they happen (server-sent events).

  • Right read
  • with ETag
  • since v2.20

The connection stays open and closes after ten minutes; the client reconnects and sends Last-Event-ID.

Only with a bot's token. A channel's events only if the bot may see it.

Parameters

NameTypeMeaning
sincein the querystringoptionalThe number of the last event the bot already has. Without it, the stream starts now and the list at the oldest.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/events/stream?since=0"

Answer

Answers with one BotEvent.

Example
{
  "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
    }
  }
}

Possible statuses: 200304401429

GET/v2/me/commands

The bot's commands.

  • Right read
  • with ETag
  • since v2.20

Only with a bot's token. A channel's events only if the bot may see it.

Example request

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

Answer

Answers with a page of BotCommand, as `items` and `next`.

Example
{
  "items": [
    {
      "name": "dice",
      "description": "Rolls a die"
    }
  ],
  "next": null
}

Possible statuses: 200304401429

PUT/v2/me/commands

Set the bot's commands, all at once.

  • Right write
  • since v2.20

Replaces all commands; an empty list removes them. In chats the bot may see, the input field offers them after “/”.

Parameters

NameTypeMeaning
commandsin the bodyobject[]requiredUp to 25 commands, each { name, description }.

Example request

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"

Answer

Answers with a page of BotCommand, as `items` and `next`.

Example
{
  "items": [
    {
      "name": "dice",
      "description": "Rolls a die"
    }
  ],
  "next": null
}

Possible statuses: 200400401403429

POST/v2/interactions/{id}/reply

Answer a command or a button.

  • Right write
  • since v2.20

Within 15 minutes of the command or interaction event; with private, only whoever used the command or button sees the answer.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id from the event (data.interaction).
textin the bodystringoptionalThe text of the post, reply or message.
privatein the bodybooleanoptionaltrue: only whoever used the command or button sees the answer, for a day.
cardin the bodyobjectoptionalA card { title, text, color, fields: [{ name, value }] }, at most 10 fields.
buttonsin the bodyobject[]optionalUp to 5 buttons, each { id, label, style } with style primary, secondary or danger. A press arrives as an interaction event.

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

POST/v2/channels/{id}/voice

Take a seat in a voice channel to play music or sound.

  • Right write
  • since v2.20

Only with a bot's token, as the bot's role allows in the channel. The program connects with a LiveKit SDK and sends its sound as a microphone; everyone else sets its volume for themselves.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of a channel.

Example request

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

Answer

Answers with one VoiceSeat.

Example
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Possible statuses: 200400401403404429

Discover

Trends, search and the instance’s custom emojis.

GET/v2/tags

The tags that are trending right now.

  • Right read
  • with ETag
  • since v2.0

At most 10 trending tags by score: each use counts 1 and halves every 3 days, an account counts at most 3 per day. posts is the rounded score. limit only shortens the list. Tags the team highlights can stand further up.

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.

Example request

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

Answer

Answers with a page of Tag, as `items` and `next`.

Example
{
  "items": [
    {
      "tag": "garden",
      "posts": 58
    }
  ],
  "next": null
}

Possible statuses: 200304401429

GET/v2/search

A search over posts, names, short names and tags.

  • Right read
  • with ETag
  • since v2.0

Searches public content only: posts outside groups, profiles and tags. limit applies per kind.

Parameters

NameTypeMeaning
qin the querystringrequiredThe words being looked for.
typein the querystringoptionalWhich kind of result. Without it, every kind.allpostsprofilestags
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/search?q=garden&type=posts"

Answer

Answers with one SearchResult.

Example
{
  "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
    }
  ]
}

Possible statuses: 200304400401429

GET/v2/emojis

The instance’s own emojis, with the address of their pictures.

  • Right read
  • with ETag
  • since v2.1

In texts an emoji appears as :name:. Replace it with the image from this list; unknown names stay text.

Example request

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

Answer

Answers with a page of Emoji, as `items` and `next`.

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

Possible statuses: 200304401429

GIFs and videos

The media library: find shared GIFs and videos, upload and manage your own, and embed them on other websites.

GET/v2/media

Shared GIFs or videos, most used first.

  • Right read
  • pageable
  • with ETag
  • since v2.14

Without accounts you blocked or that blocked you. Load url and poster with the key in the header, for posts on tellmelo.

For other websites only what has embed: its addresses work without a key, in any browser.

Parameters

NameTypeMeaning
kindin the querystringoptionalgif or video; gif when not given.gifvideo
qin the querystringoptionalWords in the name or the keywords.
anywherein the querybooleanoptionaltrue: only what may appear on other websites too.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media?kind=gif&q=bees&anywhere=true&limit=20"

Answer

Answers with a page of MediaItem, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401429

GET/v2/media/mine

Your own media library, newest first.

  • Right media
  • pageable
  • with ETag
  • since v2.14

Parameters

NameTypeMeaning
kindin the querystringoptionalgif or video; gif when not given.gifvideo
qin the querystringoptionalWords in the name or the keywords.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/mine?kind=gif&q=bees&limit=20"

Answer

Answers with a page of MediaItem, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401403429

GET/v2/media/{id}

A GIF or video, yours or a shared one.

  • Right read
  • with ETag
  • since v2.14

Parameters

NameTypeMeaning
idin the pathstringrequiredThe ID of the GIF or video.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"

Answer

Answers with one MediaItem.

Example
{
  "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>"
  }
}

Possible statuses: 200304400401404429

POST/v2/media/uploads

Start an upload.

  • Right media
  • since v2.14

Then send the file in pieces of at most piece bytes to /media/uploads/{upload}. Without a new piece an upload ends after 15 minutes.

The app’s limits apply: GIFs up to 15 MB, videos by plan in size and length, GIFs per day, private GIFs, video points per week. Otherwise you get 409, 413 or 429.

Parameters

NameTypeMeaning
kindin the bodystringrequiredgif or video; gif when not given.gifvideo
sizein the bodyintegerrequiredThe size of the whole file in bytes.
namein the bodystringrequiredThe name it is found by: 2 to 40 characters.
keywordsin the bodystringoptionalKeywords for the search, separated by spaces.
sharedin the bodybooleanoptionaltrue: shared with everyone on tellmelo.
anywherein the bodybooleanoptionaltrue: shared and allowed on other websites too. Only together with shared.

Example request

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"

Answer

Answers with one UploadStarted.

Example
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

Possible statuses: 200400401403429

PUT/v2/media/uploads/{upload}

Send a piece of the file.

  • Right media
  • since v2.14

The body is the piece itself (application/octet-stream), not JSON. If it doesn’t follow on, you get 409 with received: carry on from there. After the last piece the file is converted; the answer then has item.

Parameters

NameTypeMeaning
uploadin the pathstringrequiredThe upload from the start.
offsetin the queryintegerrequiredWhere the piece starts in the file, in bytes; 0 for the first.

Example request

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"

Answer

Answers with one UploadPiece.

Example
{
  "received": 4194304,
  "item": null
}

Possible statuses: 200400401403404429

POST/v2/media/{id}

Change one of your GIFs or videos.

  • Right media
  • since v2.14

Parameters

NameTypeMeaning
idin the pathstringrequiredThe ID of the GIF or video.
namein the bodystringoptionalThe name it is found by: 2 to 40 characters.
keywordsin the bodystringoptionalKeywords for the search, separated by spaces.
sharedin the bodybooleanoptionaltrue: shared with everyone on tellmelo.
anywherein the bodybooleanoptionaltrue: shared and allowed on other websites too. Only together with shared.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/media/{id}

Remove one of your GIFs or videos.

  • Right media
  • since v2.14

Posts that already show it keep it. On other websites it disappears within minutes.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe ID of the GIF or video.

Example request

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/media/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Your account

Your profile, your feed, your own emojis and your webhooks.

GET/v2/me

Your own profile, with the id the other paths expect.

  • Right read
  • with ETag
  • since v2.0

Example request

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

Answer

Answers with one Profile.

Example
{
  "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
}

Possible statuses: 200304401429

GET/v2/feed

Your own feed, the way the application puts it together.

  • Right read
  • pageable
  • since v2.0

No ETag, because the order keeps changing. A list you started stays the same until its end.

Parameters

NameTypeMeaning
tabin the querystringoptionalWhich feed: for-you, following, latest or bookmarks. latest by default.for-youfollowinglatestbookmarks
tagin the querystringoptionalOnly posts about this tag: written with it or recognised in them by the server. Without it, no filter.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Post, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200400401429

POST/v2/me/pictures

Upload a picture, as its bytes. Answers with id and url; you then use the id as profile picture, banner or in a post.

  • Right write
  • since v2.19

PNG, JPEG, WebP or GIF, recognised by its first bytes; stored anew without metadata. A picture used nowhere is deleted later.

Example request

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"

Answer

Answers with one Picture.

Example
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

Possible statuses: 200401403429

PUT/v2/me/profile

Change your profile: name, about, profile picture, banner and profile colour. Whatever you leave out stays.

  • Right profile
  • since v2.19

Needs the permission profile. Your @name stays in the app: it is also your sign-in name.

Parameters

NameTypeMeaning
namein the bodystringoptionalThe display name, at most 60 characters.
aboutin the bodystringoptionalThe about text.
avatarin the bodystringoptionalThe id of an uploaded picture as profile picture. Empty removes it.
bannerin the bodystringoptionalThe id of an uploaded picture as banner. Empty removes it.
colorin the bodystringoptionalThe profile colour, with a plan. null removes it.indigovioletrosecoralamberlimegreentealskyslatesandnight

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403429

GET/v2/me/emojis

Your own emojis.

  • Right read
  • with ETag
  • since v2.19

Example request

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

Answer

Answers with a page of OwnEmoji, as `items` and `next`.

Example
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Possible statuses: 200304401429

POST/v2/me/emojis/pictures

Upload the picture for an own emoji, as its bytes.

  • Right profile
  • since v2.19

Moving emojis need a plan. Too large after converting, the picture is refused.

Example request

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"

Answer

Answers with one EmojiPicture.

Example
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

Possible statuses: 200401403429

POST/v2/me/emojis

Create an own emoji. Answers with all your emojis.

  • Right profile
  • since v2.19

How many emojis you can create depends on the plan.

Parameters

NameTypeMeaning
namein the bodystringrequiredThe name you write the emoji with, as :name:.
picturein the bodystringrequiredThe id from POST /me/emojis/pictures.

Example request

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"

Answer

Answers with a page of OwnEmoji, as `items` and `next`.

Example
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Possible statuses: 200400401403429

DELETE/v2/me/emojis/{name}

Remove an own emoji. Answers with the rest.

  • Right profile
  • since v2.19

Parameters

NameTypeMeaning
namein the pathstringrequiredThe name of the emoji, without colons.

Example request

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

Answer

Answers with a page of OwnEmoji, as `items` and `next`.

Example
{
  "items": [
    {
      "name": "sunflower",
      "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
      "animated": false,
      "resting": false
    }
  ],
  "next": null
}

Possible statuses: 200400401403404429

PUT/v2/me/emojis/sharing

Set whether your followers may use your emojis in their own texts.

  • Right profile
  • since v2.19

Parameters

NameTypeMeaning
sharedin the bodybooleanrequiredtrue shares your emojis with your followers, false doesn’t.

Example request

curl -X PUT \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"shared":true}' \
  "https://api.tellmelo.com/v2/me/emojis/sharing"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403429

GET/v2/me/webhooks

Your webhooks with their state.

  • Right webhooks
  • with ETag
  • since v2.19

Needs the permission webhooks. Webhooks come with an organisation plan or as a partner.

Example request

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

Answer

Answers with a page of Webhook, as `items` and `next`.

Example
{
  "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
}

Possible statuses: 200304401403429

POST/v2/me/webhooks

Create a webhook. Answers with id and the secret for the signatures, this once only.

  • Right webhooks
  • since v2.19

Every delivery is signed with the secret (X-Tellmelo-Signature). Keep it; it is not shown again.

Parameters

NameTypeMeaning
urlin the bodystringrequiredAn HTTPS address outside local networks, without credentials.
kindsin the bodystring[]requiredWhat the webhook is told about. Which kinds are open to you depends on your plan and partnership.replymentiongroup_mentionfollowlikerepostmessagequota_changedquota_giftdrop_claimeddrop_empty

Example request

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"

Answer

Answers with one WebhookCreated.

Example
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

Possible statuses: 200400401403429

DELETE/v2/me/webhooks/{id}

Delete a webhook.

  • Right webhooks
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the webhook.

Example request

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/webhooks/1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/me/webhooks/{id}/test

Send a test to a webhook.

  • Right webhooks
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the webhook.

Example request

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/webhooks/1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b/test"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Notifications

What happened around your account, page by page.

GET/v2/notifications

Your notifications, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

Reading marks nothing as read; POST /notifications/read does. Events of the same kind on the same post share one row; more says how many.

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Notification, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304401429

POST/v2/notifications/read

Mark your notifications as read.

  • Right write
  • since v2.0

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200401403429

Messages

Your inbox and conversations. A conversation is named after the other account.

GET/v2/conversations

Your inbox: one row per conversation, the most recent first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of Conversation, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304401429

GET/v2/conversations/{with}/messages

The messages of one conversation, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.0

Reading marks nothing as read; POST /conversations/{with}/read does.

Parameters

NameTypeMeaning
within the pathstringrequiredThe id of the other account. A conversation has no id of its own.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages?limit=20"

Answer

Answers with a page of Message, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304400401404429

POST/v2/conversations/{with}/messages

Send a message in a conversation.

  • Right write
  • since v2.0

The app’s rules apply: whoever blocked you can’t be reached, and the other person’s settings count.

Images, GIFs and videos can’t be attached to messages through the API, only in the app.

Parameters

NameTypeMeaning
within the pathstringrequiredThe id of the other account. A conversation has no id of its own.
textin the bodystringrequiredThe text of the post, reply or message.
replyToin the bodystringoptionalThe id of an earlier message in this conversation that this one answers. Since 2.2.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/conversations/{with}/read

Mark every message of a conversation as read.

  • Right write
  • since v2.1

Parameters

NameTypeMeaning
within the pathstringrequiredThe id of the other account. A conversation has no id of its own.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/conversations/{with}/messages/{id}

Delete one of your messages.

  • Right write
  • since v2.12

Your own messages only, and only within 24 hours of sending.

Parameters

NameTypeMeaning
within the pathstringrequiredThe id of the other account. A conversation has no id of its own.
idin the pathstringrequiredThe id of the message.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

POST/v2/conversations/{with}/planned

Plan a message for later. Answers with the id of the planned message.

  • Right write
  • since v2.19

Needs a plan that includes planned messages, otherwise 403. With end-to-end encryption on both sides it only works in the app.

Parameters

NameTypeMeaning
within the pathstringrequiredThe id of the other account. A conversation has no id of its own.
textin the bodystringrequiredThe text of the post, reply or message.
sendAtin the bodyintegerrequiredWhen the message is sent, in milliseconds since 1970.

Example request

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"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403404429

GET/v2/me/planned-messages

Your own messages still to be sent, in order of their time.

  • Right read
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
within the querystringoptionalOnly the messages to this account (its id).

Example request

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

Answer

Answers with a page of PlannedMessage, as `items` and `next`.

Example
{
  "items": [
    {
      "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
      "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "text": "Happy birthday! 🎂",
      "sendAt": 1758710400000,
      "state": "waiting"
    }
  ],
  "next": null
}

Possible statuses: 200304401429

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

Send a held or failed planned message now.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the planned message.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

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

Delete a planned message before it is sent.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the planned message.

Example request

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

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Relations

Like, save, repost, follow, join, block: one path, set and removed with active. Since 2.19 also the lists: followers, following, and your own blocks and mutes.

POST/v2/relations

Like, save, repost, follow, join, block, mute, depending on kind.

  • Right write
  • since v2.0

target is a post for like, save and repost, a group for join, an account for follow, block and mute. active: false removes the relation.

Parameters

NameTypeMeaning
kindin the bodystringrequiredWhich relation: like, save, repost, follow, join, block or mute (since 2.2).likesaverepostfollowjoinblockmute
targetin the bodystringrequiredThe id of the post, profile or group, depending on kind.
activein the bodybooleanoptionaltrue sets the relation, false removes it.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403429

GET/v2/profiles/{handle}/followers

Who follows a profile, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
handlein the pathstringrequiredThe short name of a profile, in any mix of capitals.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of ProfileBrief, as `items` and `next`.

Example
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Possible statuses: 200304400401404429

GET/v2/profiles/{handle}/following

Whom a profile follows, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.19

Parameters

NameTypeMeaning
handlein the pathstringrequiredThe short name of a profile, in any mix of capitals.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of ProfileBrief, as `items` and `next`.

Example
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Possible statuses: 200304400401404429

GET/v2/me/relations

Whom you blocked, muted, or blocked from messaging only, newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.19

Only your own lists. Setting and removing goes through POST /relations.

Parameters

NameTypeMeaning
kindin the querystringrequiredblock blocked, mute muted, dm_block blocked from messaging only.blockmutedm_block
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/relations?kind=mute&limit=20"

Answer

Answers with a page of ProfileBrief, as `items` and `next`.

Example
{
  "items": [
    {
      "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
      "handle": "mara",
      "name": "Mara 🌻",
      "verified": true,
      "accountKind": "person"
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Possible statuses: 200304400401429

Collections

Sort saved posts into your own collections. A post can be in several; taken out of a collection it stays saved.

GET/v2/me/collections

Your collections with the number of their posts.

  • Right read
  • with ETag
  • since v2.19

Example request

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

Answer

Answers with a page of Collection, as `items` and `next`.

Example
{
  "items": [
    {
      "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
      "name": "Recipes",
      "count": 12
    }
  ],
  "next": null
}

Possible statuses: 200304401429

POST/v2/me/collections

Create a collection. Answers with its id.

  • Right write
  • since v2.19

How many collections you can create depends on the plan.

Parameters

NameTypeMeaning
namein the bodystringrequiredThe name, at most 40 characters. Unique per account, ignoring case.

Example request

curl -X POST \
  -H "Authorization: Bearer tm_key_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"Recipes"}' \
  "https://api.tellmelo.com/v2/me/collections"

Answer

Answers with one Made.

Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Possible statuses: 200400401403429

PUT/v2/me/collections/{id}

Rename a collection.

  • Right write
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the collection.
namein the bodystringrequiredThe name, at most 40 characters. Unique per account, ignoring case.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

DELETE/v2/me/collections/{id}

Delete a collection.

  • Right write
  • since v2.19

The posts in it stay saved.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the collection.

Example request

curl -X DELETE \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

GET/v2/me/collections/{id}/posts

The posts of a collection, as in the saved tab.

  • Right read
  • pageable
  • since v2.19

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the collection.
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://api.tellmelo.com/v2/me/collections/6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718/posts?limit=20"

Answer

Answers with a page of Post, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200400401404429

POST/v2/me/collections/{id}/posts

Put a post into a collection or take it out.

  • Right write
  • since v2.19

Putting a post in also saves it. Visible posts only.

Parameters

NameTypeMeaning
idin the pathstringrequiredThe id of the collection.
postin the bodystringrequiredThe id of the post.
insidein the bodybooleanoptionaltrue puts the post in (default), false takes it out.

Example request

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"

Answer

Answers with one Ok.

Example
{
  "ok": true
}

Possible statuses: 200400401403404429

Gifts

Read a partner’s quota and give from it, put gifts under posts and keep an eye on them. Claiming stays with people in the app.

GET/v2/partner/quota

What’s left in your quota to give away.

  • Right read
  • with ETag
  • since v2.12

For partners with a quota only; everyone else gets 403.

Example request

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

Answer

Answers with one Quota.

Example
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

Possible statuses: 200304401429

GET/v2/partner/gifts

What you’ve given from your quota, to whom and when – newest first.

  • Right read
  • pageable
  • with ETag
  • since v2.12

For partners with a quota only; everyone else gets 403.

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of QuotaGift, as `items` and `next`.

Example
{
  "items": [
    {
      "item": "plan",
      "quantity": 3,
      "itemId": null,
      "recipient": {
        "handle": "jon",
        "name": "Jon"
      },
      "createdAt": 1758627600000
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Possible statuses: 200304401429

POST/v2/partner/gifts

Give plan months or sparks from your quota to a member.

  • Right gifts
  • since v2.12

For partners with a quota only; everyone else gets 403.

Just like in the app, the member sees who the gift is from. At most 60 gifts per hour.

Parameters

NameTypeMeaning
handlein the bodystringrequiredThe @name of the member you’re giving to, with or without the @.
itemin the bodystringrequiredplan for plan months, sparks for sparks, shop for a look from your stock (since 2.13).plansparksshop
quantityin the bodyintegeroptionalHow much: up to 12 months or 35 sparks per gift.
itemIdin the bodystringoptionalFor shop: the look’s ID as looks in the quota names it. One piece per gift; quantity does not apply.

Example request

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"

Answer

Answers with one Quota.

Example
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

Possible statuses: 200400401403429

GET/v2/gift-drops

Your gifts under posts: how many places are still open and how they were paid for.

  • Right read
  • pageable
  • with ETag
  • since v2.12

Parameters

NameTypeMeaning
limitin the queryintegeroptionalEntries per page: 20 by default, at most 50.
cursorin the querystringoptionalThe next of the previous answer. Without it, from the start.

Example request

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

Answer

Answers with a page of OwnGiftDrop, as `items` and `next`.

Example
{
  "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"
}

Possible statuses: 200304401429

POST/v2/gift-drops

Publish a post with gifts for others to claim.

  • Right gifts
  • since v2.12

Free for the owner and team members with that permission, otherwise it comes out of your quota. Anything that would need paying is refused with 422 – paying only works in the app.

Claiming only works in the app, so no program can sweep up every place. How many are still open is in the post’s giftDrop.

Parameters

NameTypeMeaning
textin the bodystringoptionalThe text of the post, reply or message.
communityin the bodystringoptionalThe id of the group whose feed channel the post goes to; it must be on, and you need the permission for it. Without it the post stands outside any group.
itemin the bodystringrequiredplan for plan months, sparks for sparks.plansparks
quantityin the bodyintegerrequiredWhat each place holds: up to 12 months or 35 sparks.
placesin the bodyintegerrequiredHow many people, up to 10,000.
audiencein the bodystringoptionalWho can claim: all everyone, followers only your followers, group only members of the group (only together with community).allfollowersgroup
newAccountsin the bodybooleanoptionaltrue lets accounts younger than 7 days claim too. Leave it out to keep them out.

Example request

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"

Answer

Answers with one DropCreated.

Example
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Possible statuses: 200400401403429

Objects

All objects, field by field. [] means list.

Service

The answer of the root: who is answering, and what this key may do.

FieldTypeMeaning
namestringAlways tellmelo.
versionstringThe version of the API, for example 2.1.
scopestringWhat this key may do: read or read write.
rateLimitRateLimitThe budget of this key.
docsstringWhere this documentation is, as a path on this instance.
specstringWhere the machine-readable description is.
Example
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

RateLimit

The budget of this key in the current minute.

FieldTypeMeaning
limitintegerRequests per minute.
remainingintegerHow many are left in this minute.
Example
{
  "limit": 120,
  "remaining": 117
}

Post

A post, in the same shape everywhere.

FieldTypeMeaning
idstringThe id of the post.
textstringor nullThe text as written (null for a post that is only a poll or only pictures).
kindstringWhat the post is.
  • post — A post with text, pictures or a quote.
  • poll — A post with a poll.
authorProfileBriefWho wrote it.
communityCommunityBriefor nullThe group it was written in (null outside every group).
mediaMedia[]Its images, in order; empty if there are none.
pollPollor nullThe poll (null if there is none).
quotesstringor nullThe id of the post this one quotes.
continuesstringor nullThe id of the post this one continues, as an addendum.
countsCountsReplies, likes and reposts.
pinnedbooleanWhether it is pinned to the top of its author’s profile.
giftDropGiftDropor nullGifts to claim under the post (null if there are none).
createdAtintegerWhen it was written.
Example
{
  "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

A reply under a post: a post with two more fields.

Every field of Post, and in addition:

FieldTypeMeaning
postIdstringThe post the whole conversation hangs off.
parentIdstringor nullThe reply this one answers (null if it answers the post directly).
Example
{
  "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

Your vote on a reply and its score.

FieldTypeMeaning
votestringYour vote.
  • up — Voted up.
  • down — Voted down.
  • none — No vote.
scoreintegerUpvotes minus downvotes, also below zero.
Example
{
  "vote": "up",
  "score": 12
}

PlannedReply

One of your replies planned for later.

FieldTypeMeaning
idstringThe id of the planned reply.
parentIdstringor nullThe reply it will answer (null if it answers the post directly).
textstringThe text.
publishAtintegerWhen it goes out.
statestringIts state.
  • waiting — Waiting for its time.
  • failed — Could not be sent, for example because the post is gone.
Example
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "parentId": null,
  "text": "Count me in for Saturday!",
  "publishAt": 1758710400000,
  "state": "waiting"
}

ReplySettings

The reply settings of one of your posts.

FieldTypeMeaning
audiencestringWho may reply.
  • all — Everyone.
  • following — Accounts you follow.
  • mentioned — Those mentioned in the post.
  • nobody — Nobody but you.
approvalbooleanWhether replies wait for your approval.
slowstringSlow mode.
  • auto — Turns itself on when many replies come in.
  • on — Always on.
  • off — Off.
Example
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Counts

How many replies, likes and reposts a post has.

FieldTypeMeaning
repliesintegerReplies, all levels together.
likesintegerLikes.
repostsintegerReposts.
Example
{
  "replies": 4,
  "likes": 31,
  "reposts": 2
}

Media

An image of a post or a message.

FieldTypeMeaning
urlstringThe address of the picture or video, relative to this instance. Load it with the key in the header.
kindstringimage, video or gif (since 2.10). Videos and GIFs are MP4 files.
  • image — An image (WebP or JPEG).
  • video — A video as MP4, with sound.
  • gif — A GIF, as a silent looping MP4.
posterstringor nullFor videos and GIFs the address of the preview image, otherwise null (since 2.10).
aistringor nullWhether the image was made with AI, as the uploader said or the team marked it after a report; null without a label (since 2.11).
  • with — Made with AI.
  • without — Made without AI.
Example
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null,
  "ai": "without"
}

Poll

The poll of a post.

FieldTypeMeaning
optionsPollOption[]The answers, in order. option in a vote counts from 0.
totalintegerAll votes together, always present.
multiplebooleanWhether more than one answer may be chosen.
endsAtintegeror nullWhen the poll ends (null if it runs without an end).
runningbooleanWhether votes can still be cast.
resultsVisiblebooleanWhether the votes per answer are shown (see votes).
myVotesinteger[]The answers you chose, counted from 0.
Example
{
  "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

One answer of a poll.

FieldTypeMeaning
textstringThe answer.
votesintegeror nullIts votes (null while the results are held back).
Example
{
  "text": "Lavender",
  "votes": 12
}

ProfileBrief

A profile as it appears inside other objects: as an author, in a search.

FieldTypeMeaning
idstringThe id of the account: what /relations and /conversations/{with} expect.
handlestringThe short name, without @, written the way the member chose it.
namestringThe display name. It may contain emojis, including :name:.
verifiedbooleanWhether the account is verified.
accountKindstringWhat kind of account it is.
  • person — A person.
  • business — A business.
  • association — A club or association.
  • automated — An automated account, such as a bot.
  • bot — A bot of groups, run by a program with its own key (since 2.18).
Example
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person"
}

Profile

A profile on its own, with its description and its followers.

Every field of ProfileBrief, and in addition:

FieldTypeMeaning
aboutstringor nullThe description (null if there is none).
websitestringor nullThe profile’s website (null if there is none). Since 2.3.
websiteVerifiedbooleanWhether the website links back to this profile with rel=me, checked weekly. Since 2.3.
followersintegerHow many accounts follow it.
createdAtintegeror nullWhen the account was created (null while the member hides the join date; since 2.9).
Example
{
  "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

The group a post was written in.

FieldTypeMeaning
idstringThe id of the group.
namestringor nullIts name.
Example
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening"
}

Community

A group of this instance.

FieldTypeMeaning
idstringThe id of the group.
namestringIts name.
handlestringor nullThe short name to mention the group with @#. Since 2.15.
descriptionstringor nullThe description (null if there is none).
tagsstring[]The topics it is about.
membersintegerHow many members it has.
joinPolicystringHow one gets in.
  • open — Anyone can join.
  • application — Joining takes an application that the group accepts.
  • invite — Only by invitation.
visibilitystringWho sees it. internal and hidden only its members (since 2.15).
  • open — Visible to everyone.
  • internal — Not found in the directory, but through its address.
  • hidden — Only for its members.
feedChannelbooleanWhether its feed channel is on. Since 2.15.
sparksintegerHow many sparks the group holds right now (since 2.19).
perksstring[]The perks its sparks pay for (since 2.19).
membershipMembershipor nullWhat your account is and may do in the group; null if it is no member. Since 2.15.
Example
{
  "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

What your account is and may do in the group.

FieldTypeMeaning
leaderstringor nullWhether you founded the group or help lead it; null otherwise.
  • founder — Founded it.
  • manager — Co-leads it.
rolesstring[]The ids of your roles, the highest first.
permissionsstring[]What you may do in the group.
mutedUntilintegeror nullUntil when a timeout mutes you here; null without one.
Example
{
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "mutedUntil": null
}

Person

A member, in short.

FieldTypeMeaning
idstringThe account’s id.
handlestringThe username, without @.
namestringThe display name.
botbooleanWhether the account is a bot (since 2.18).
Example
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false
}

Channel

A channel of a group.

FieldTypeMeaning
idstringThe id.
kindstringWhich kind of channel.
  • feed — The feed channel, whose posts are also in the public feed.
  • chat — A chat.
  • voice — A voice channel; talking works in the app only.
  • hub — The group’s hub: its page with what it is. Always there, without messages.
namestringor nullThe name without #; null for the name the app gives in each language.
topicstringThe topic; empty if there is none.
categoryChannelCategoryor nullThe category; null without one.
unreadintegerHow many messages of others you have not read yet, up to 100.
permissionsstring[]What you may do in this channel.
symbolChannelSymbolIts symbol; the shape already the group’s when it sets one.
Example
{
  "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

The category a channel is under.

FieldTypeMeaning
idstringThe id.
namestringThe name.
symbolChannelSymbolIts symbol.
Example
{
  "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "name": "Garden",
  "symbol": {
    "emoji": null,
    "icon": null,
    "image": null,
    "color": null,
    "shape": null
  }
}

ChannelSymbol

A channel’s or category’s symbol: at most one of emoji, symbol and picture, otherwise the sign of its kind.

FieldTypeMeaning
emojistringor nullThe emoji; null without one.
iconstringor nullThe name of the symbol of the app’s set; null without one.
imagestringor nullThe address of the own picture; null without one.
colorstringor nullThe tile’s colour; null for that of its kind.
shapestringor nullThe tile’s shape; null for a circle.
Example
{
  "emoji": "🌻",
  "icon": null,
  "image": null,
  "color": "amber",
  "shape": "circle"
}

ChannelMessage

A message in a chat channel.

FieldTypeMeaning
idstringThe id.
textstringor nullThe text (null for a message of only pictures or voice).
authorPersonWho wrote it.
mediaMedia[]Its pictures and voice messages; empty if there are none.
replyTostringor nullThe id of the message it answers; null if none.
roleColorstringor nullThe colour of the author's highest role that has one; null without.
threadOfstringor nullThe message whose thread this one replies in; null in the chat.
threadCountintegerHow many replies this message's thread has.
cardobjector nullA bot's card: title, text, color and fields; otherwise null.
buttonsobject[]A bot's buttons: each id, label and style.
createdAtintegerWhen it was written.
Example
{
  "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

A role of a group.

FieldTypeMeaning
idstringThe id.
namestringor nullThe name; null for @everyone.
everyonebooleanWhether it is @everyone, the role of all members.
colorstringor nullThe colour: indigo, violet, rose, amber, green or teal; null without one.
permissionsstring[]Its permissions.
membersintegerHow many have it; for @everyone all members.
editablebooleanWhether your account may change it.
selfablebooleanWhether members take and put down the role themselves.
Example
{
  "id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "name": "Gardeners",
  "everyone": false,
  "color": "green",
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "members": 24,
  "editable": true,
  "selfable": false
}

GroupMember

A member of a group with their roles.

Every field of Person, and in addition:

FieldTypeMeaning
leaderstringor nullWhether the member founded the group or helps lead it; null otherwise.
  • founder — Founded it.
  • manager — Co-leads it.
rolesstring[]The ids of their roles, the highest first.
mutedUntilintegeror nullUntil when a timeout mutes the member, if your account may give timeouts; null otherwise.
Example
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false,
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "mutedUntil": null
}

ChannelOverride

What a role may do differently in a channel than in the group.

FieldTypeMeaning
rolestringThe role’s id.
allowstring[]What it may also do here.
denystring[]What it may not do here.
Example
{
  "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "allow": [
    "send"
  ],
  "deny": []
}

Bell

A group’s bell.

FieldTypeMeaning
levelstringWhich notifications come.
  • all — Every new post in the feed channel, and @everyone.
  • important — The leadership’s posts in the feed channel, and @everyone.
  • off — Nothing, unless you are mentioned with @name.
Example
{
  "level": "important"
}

InviteLink

An invitation link of a group.

FieldTypeMeaning
codestringThe code.
urlstringThe address to share.
createdByPersonor nullWho created it; null if the account is deleted.
createdAtintegerWhen it was created.
expiresAtintegeror nullUntil when it works; null without an end.
usesintegerHow often it was used.
maxUsesintegeror nullHow often it can be used; null for any number of times.
Example
{
  "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

Where an invitation link leads.

FieldTypeMeaning
communityInviteGroupThe group.
memberbooleanWhether your account is a member already.
Example
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

InviteGroup

The group behind an invitation link.

FieldTypeMeaning
idstringThe id.
namestringThe name.
membersintegerHow many members it has.
rulesstring[]Its rules, accepted when joining; empty if there are none.
Example
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "members": 312,
  "rules": [
    "Be kind.",
    "No advertising."
  ]
}

Joined

Joining with an invitation link.

FieldTypeMeaning
communitystringThe group’s id.
Example
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

LogEntry

An entry in the leadership’s log.

FieldTypeMeaning
idstringThe id.
actionstringWhat happened.
  • post_removed — A post.
  • member_removed — A member removed, before 2.16 (kept out for 90 days).
  • message_removed — A message in a chat channel.
  • member_kicked — A kick.
  • member_banned — A ban.
  • member_unbanned — A ban lifted.
  • member_timed_out — A timeout.
  • timeout_lifted — A timeout lifted.
  • voice_muted — Muted in a voice channel.
  • voice_removed — Disconnected from a voice channel.
  • bot_added — A bot was taken into the group (since 2.18).
  • bot_removed — A bot was taken out of the group (since 2.18).
memberPersonWhom it concerned.
reasonstringThe reason; empty for messages and when none was given.
bystringor nullThe name of who did it; null if the account is deleted.
createdAtintegerWhen.
Example
{
  "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

A ban from a group.

FieldTypeMeaning
memberPersonWho is banned.
untilintegeror nullUntil when; null until it is lifted.
createdAtintegeror nullSince when; null for bans from before 2.16.
bystringor nullThe name of who banned; null if unknown.
Example
{
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "until": 1759228800000,
  "createdAt": 1758624000000,
  "by": "Mara 🌻"
}

Until

When a timeout or ban ends.

FieldTypeMeaning
untilintegeror nullThe time; null for a ban without an end or a timeout that was lifted.
Example
{
  "until": 1758624600000
}

Tag

A tag and how many posts carry it.

FieldTypeMeaning
tagstringThe tag, without #.
postsintegerHow many recent posts carry it.
Example
{
  "tag": "garden",
  "posts": 58
}

SearchResult

Three lists, possibly empty.

FieldTypeMeaning
postsPost[]Matching posts, newest first.
profilesProfileBrief[]Matching profiles, by short name.
tagsTag[]Matching tags, most used first.
Example
{
  "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

An emoji of this instance.

FieldTypeMeaning
namestringThe name, as it stands between the colons.
urlstringThe address of the picture, relative to this instance.
Example
{
  "name": "tellmelo",
  "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
}

Notification

A notification. One row can gather several events of the same kind.

FieldTypeMeaning
idstringThe id of the notification.
kindstringWhat happened.
  • reply — Someone replied to you.
  • like — Someone likes your post.
  • reply_like — Someone upvotes your reply.
  • duel — Someone challenges you to a Feed Duel, or your challenge has been played.
  • reply_pick — The author of a post highlights your reply.
  • repost — Someone shared your post.
  • follow — Someone follows you.
  • mention — Someone mentioned you.
  • group_mention — Someone mentioned a group you lead; text is its name.
  • channel_mention — Someone mentioned you in a chat channel of one of your groups, @everyone included; the member is the actor, the sentence names channel and group, never the message.
  • message — Someone wrote you a message.
  • scheduled — A scheduled post of yours has been published.
  • video — A post of yours that waited for its video went out or became a draft again.
  • reminder — A reminder about a saved post is due.
  • report — What became of a report you sent in.
  • moderation — A decision about your account: a warning, a restriction, an appeal.
  • team — New work for the team (owners, admins and moderators only).
  • reward — A reward for inviting is about to go or has gone.
  • gift — A present from the team: a plan, or sparks for you or for a group you lead.
  • present — A gift from a member: sparks or plan time; the member is the actor.
  • spark — Sparks end soon, or a group you lead no longer has enough sparks for its perks.
  • loyalty — About the loyalty rhythm: an active week counts or is one day short, a reward is new or about to fade.
  • impact — How your posts from the first twelve hours did after a day, in one notification.
  • discovery — An invitation to the discovery programme, or that a place there begins or ends.
  • group_post — A new post in a group whose bell rings for it.
  • group_moderation — A group’s leadership removed one of your posts, or you, from the group.
  • group — Something a member did with you in a group: invited, admitted or turned you down, made you co-lead, handed the group over or dissolved it, or applied to your group; the member is the actor, the group’s name ends the sentence.
  • coauthor — Someone invited you as co-author of a post.
  • partner — A reminder from the partner programme, or the end of the partner badge.
  • news — A new article in a region you follow.
  • pick — A post of yours is up for post of the week or of the year, or it won.
  • advent — A new door of the Advent calendar is open, one was opened, or today’s is still waiting.
  • team_message — A message the tellmelo team wrote to chosen members.
  • challenge — A new challenge of the week has begun.
  • nudge — Once: a post nobody has answered yet, or the running challenge.
  • signin — A computer asks whether you are signing in there right now.
textstringor nullOnly for reports and moderation: the related text, otherwise null.
actorActorWho did it.
postIdstringor nullThe post it is about (null if it is about none).
readbooleanWhether it has been marked as read.
moreintegerHow many further events this row stands for, beyond the one named.
createdAtintegerWhen it first happened.
updatedAtintegerWhen it last gathered another event. The list is sorted by this.
Example
{
  "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

Who triggered a notification.

FieldTypeMeaning
handlestringThe short name.
namestringThe display name.
Example
{
  "handle": "jon",
  "name": "Jon"
}

Conversation

One row of your inbox.

FieldTypeMeaning
withstringThe id of the other account: what /conversations/{with}/messages expects.
handlestringTheir short name.
namestringTheir display name.
excerptstringor nullThe beginning of the last message (null if it has no text).
truncatedbooleanWhether the excerpt was cut short.
fromMebooleanWhether the last message is yours.
lastMessageIdstringThe id of the last message.
unreadintegerHow many of their messages you have not read yet.
updatedAtintegerWhen the last message was written.
Example
{
  "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

A message in a conversation.

FieldTypeMeaning
idstringThe id of the message.
textstringor nullThe text (null for a message that is only pictures).
fromstringThe id of the account that wrote it.
tostringThe id of the account it was written to.
readbooleanWhether the recipient has read it.
mediaMedia[]Its images; empty if there are none.
replyTostringor nullThe id of the message this one answers (null if it answers none). Since 2.2.
createdAtintegerWhen it was sent.
Example
{
  "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

One of your messages planned for later.

FieldTypeMeaning
idstringThe id of the planned message.
tostringThe id of the account receiving it.
textstringor nullThe text, null with end-to-end encryption.
sendAtintegerWhen it is sent.
statestringIts state.
  • waiting — Waiting for its time.
  • held — Held because the plan ended. You can send it yourself or delete it.
  • failed — Could not be sent.
Example
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "text": "Happy birthday! 🎂",
  "sendAt": 1758710400000,
  "state": "waiting"
}

ScheduledPost

One of your posts that isn’t out yet.

FieldTypeMeaning
idstringThe id of the post.
textstringor nullThe text.
communityIdstringor nullThe group it appears in (null outside groups).
publishAtintegeror nullWhen it goes out (null while it’s waiting for something else).
deleteAtintegeror nullWhen it deletes itself (null: never).
waitingForstringWhat it’s waiting for.
  • time — Its time.
  • review — Approval of a text written for review.
  • check — The automatic moderation’s check.
  • payment — Payment for its gifts.
createdAtintegerWhen it was written.
Example
{
  "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

A collection of saved posts.

FieldTypeMeaning
idstringThe id of the collection.
namestringIts name.
countintegerHow many posts are in it.
Example
{
  "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
  "name": "Recipes",
  "count": 12
}

Event

An upcoming event of a profile.

FieldTypeMeaning
idstringThe id of the event.
titlestringThe title.
startsAtintegerStart.
endsAtintegeror nullEnd, null without an end.
placestringor nullThe place.
descriptionstringor nullThe description.
signupsEventSignupsor nullThe sign-ups, null without sign-ups.
Example
{
  "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

How many have signed up.

FieldTypeMeaning
countintegerThe number of sign-ups.
goingbooleanWhether you have signed up.
Example
{
  "count": 14,
  "going": true
}

EventSignup

Someone who signed up for one of your events.

FieldTypeMeaning
idstringThe id of the account.
handlestringThe handle.
namestringThe display name.
atintegerWhen they signed up.
Example
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "at": 1758624000000
}

Picture

An uploaded picture.

FieldTypeMeaning
idstringThe id of the picture.
urlstringWhere it can be seen.
Example
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

EmojiPicture

The uploaded picture of an emoji.

FieldTypeMeaning
idstringThe id of the picture.
urlstringWhere it can be seen.
animatedbooleanWhether it moves.
Example
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

OwnEmoji

One of your own emojis.

FieldTypeMeaning
namestringIts name.
urlstringIts picture.
animatedbooleanWhether it moves.
restingbooleanResting because the plan allows fewer emojis right now: it stays but can’t be used.
Example
{
  "name": "sunflower",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false,
  "resting": false
}

GroupEmoji

An emoji of a group.

FieldTypeMeaning
namestringIts name.
urlstringIts picture.
animatedbooleanWhether it moves.
Example
{
  "name": "seedling",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

BotEvent

An event in one of the bot's groups.

FieldTypeMeaning
idstringIts number, ascending; it's how you continue (since, Last-Event-ID).
typestringWhat happened.
  • message.created — A message was written.
  • message.deleted — A message was deleted.
  • member.joined — Someone joined.
  • member.left — Someone left or was removed.
  • voice.joined — Someone joined a voice channel.
  • command — Someone used one of the bot's commands.
  • interaction — Someone pressed a button in one of the bot's messages.
communitystringThe group.
channelstringor nullThe channel; null for the whole group.
createdAtintegerWhen it happened.
dataobjectWhat belongs to it, by type: message, member (with reason), command or interaction.
Example
{
  "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

A command of a bot.

FieldTypeMeaning
namestringIts name, without “/”.
descriptionstringWhat it does.
Example
{
  "name": "dice",
  "description": "Rolls a die"
}

VoiceSeat

A seat in a voice channel.

FieldTypeMeaning
urlstringThe media server's address (LiveKit).
tokenstringThe token for this channel, valid for a few minutes.
iceServersobject[]The STUN and TURN servers for the connection.
speakbooleanWhether the bot may send sound there.
videobooleanWhether the bot may send video there.
Example
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Webhook

One of your webhooks.

FieldTypeMeaning
idstringThe id of the webhook.
urlstringIts address.
kindsstring[]What it is told about.
activebooleanWhether it receives deliveries. After many failures in a row it is switched off.
lastStatusintegeror nullThe HTTP status of the last delivery.
lastAtintegeror nullWhen the last delivery was.
failuresintegerFailures in a row.
Example
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "url": "https://example.org/tellmelo-hook",
  "kinds": [
    "reply",
    "mention"
  ],
  "active": true,
  "lastStatus": 200,
  "lastAt": 1758624000000,
  "failures": 0
}

WebhookCreated

A new webhook with its secret.

FieldTypeMeaning
idstringThe id of the webhook.
secretstringThe secret for the signatures, this once only.
Example
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

GroupBot

A bot of a group.

FieldTypeMeaning
idstringThe id of the bot account.
handlestringIts handle.
namestringIts name.
descriptionstringWhat it does, in its owner’s words.
permissionsstring[]What its role in the group allows.
Example
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "gardenbot",
  "name": "Garden bot",
  "description": "Reminds the group of watering days.",
  "permissions": [
    "send",
    "view"
  ]
}

VoiceRoom

A voice channel with the people in it.

FieldTypeMeaning
channelstringThe id of the channel.
peopleVoicePerson[]Who is in it right now.
Example
{
  "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

Someone in a voice channel.

FieldTypeMeaning
idstringThe id of the account.
handlestringThe handle.
namestringThe display name.
mutedbooleanWhether their microphone is off.
deafbooleanWhether they hear nothing (their own choice).
camerabooleanWhether their camera is on.
screenbooleanWhether they share their screen.
Example
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "muted": true,
  "deaf": false,
  "camera": false,
  "screen": false
}

GiftDrop

Gifts under a post – never with the names of those who claimed them.

FieldTypeMeaning
itemstringWhat a place holds.
  • plan — Plan months (Supporter).
  • sparks — Sparks.
quantityintegerHow much each place holds: months or sparks.
placesintegerHow many places there are in total.
leftintegerHow many are still open.
audiencestringWho can claim.
  • all — Everyone.
  • followers — Only followers of the person giving.
  • group — Only members of the post’s group.
newAccountsbooleanWhether accounts younger than 7 days can claim too.
statusstringWhere things stand.
  • awaiting_payment — Waiting for payment; the post isn’t out yet.
  • open — Places are still up for grabs.
  • closed — Over: all claimed, the payment refunded or the post deleted.
claimedbooleanWhether you already have a place yourself (always false on public paths).
Example
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": true
}

OwnGiftDrop

Your gifts under a post, with the post and how they were paid for.

Every field of GiftDrop, and in addition:

FieldTypeMeaning
postIdstringThe post they’re under.
fundingstringHow they’re paid for.
  • free — Free.
  • quota — From the quota.
  • payment — Paid.
createdAtintegerWhen they were created.
Example
{
  "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

What’s in a quota.

FieldTypeMeaning
monthsintegerPlan months still to give away.
sparksintegerSparks still to give away.
looksQuotaLook[]Looks in stock still to give away (since 2.13).
Example
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

QuotaLook

A look in a partner’s stock, with the pieces left (since 2.13).

FieldTypeMeaning
idstringThe look’s ID; pass it as itemId when giving it.
namestringThe look’s name.
kindstringWhat kind of look it is.
  • frame — Profile frame.
  • background — Cover effect.
  • card — Profile card.
quantityintegerHow many pieces are left.
Example
{
  "id": "frame-gold",
  "name": "Goldring",
  "kind": "frame",
  "quantity": 25
}

QuotaGift

A gift from the quota.

FieldTypeMeaning
itemstringWhat was given.
  • plan — Plan months (Supporter).
  • sparks — Sparks.
  • shop — A look from the stock (since 2.13).
quantityintegerHow much.
itemIdstringor nullThe look given when item is shop; otherwise null.
recipientActorTo whom.
createdAtintegerWhen.
Example
{
  "item": "plan",
  "quantity": 3,
  "itemId": null,
  "recipient": {
    "handle": "jon",
    "name": "Jon"
  },
  "createdAt": 1758627600000
}

MediaItem

A GIF or video from the media library (since 2.14).

FieldTypeMeaning
idstringThe ID; for media when posting.
kindstringGIF or video.
  • gif — A GIF, as a silent looping MP4.
  • video — A video as MP4, with sound.
namestringThe name.
keywordsstringThe keywords, in lowercase.
widthintegerWidth in pixels.
heightintegerHeight in pixels.
secondsintegerLength in seconds; 0 for GIFs.
urlstringThe MP4 file, relative to this instance. Load it with the key in the header.
posterstringThe preview image, also with the key.
uploaderActorWho uploaded it.
minebooleanWhether it is yours.
sharedbooleanWhether it is shared with everyone on tellmelo.
anywherebooleanWhether it may appear on other websites too.
embedEmbedor nullThe addresses for other websites; null while it isn’t allowed there.
Example
{
  "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

The addresses for other websites. They work without a key.

FieldTypeMeaning
pagestringThe player for an <iframe>.
filestringThe MP4 file for a player of your own.
posterstringThe preview image.
codestringThe finished code to embed it.
Example
{
  "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

An upload that has started.

FieldTypeMeaning
uploadstringThe ID of this upload.
pieceintegerThe largest a piece may be, in bytes.
Example
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

UploadPiece

A piece that arrived.

FieldTypeMeaning
receivedintegerHow many bytes have arrived.
itemMediaItemor nullAfter the last piece the new GIF or video, otherwise null.
Example
{
  "received": 4194304,
  "item": null
}

Created

The answer of a write that created something.

FieldTypeMeaning
idstringThe id of what was created.
scheduledForintegeror nullWhen it appears, if publishing was scheduled (otherwise null).
deleteAtintegeror nullWhen it deletes itself, if that was set (otherwise null).
Example
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

DropCreated

The response when a post with gifts was created.

FieldTypeMeaning
idstringThe id of the new post.
fundingstringHow the gifts are paid for.
  • free — Free.
  • quota — From the quota.
Example
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Made

What was just created or changed.

FieldTypeMeaning
idstringThe id; for an invitation link its code.
Example
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Ok

The answer of a write that has nothing to hand back.

FieldTypeMeaning
okbooleanAlways true.
Example
{
  "ok": true
}

The machine-readable description

The table behind this page is available as OpenAPI at https://api.tellmelo.com/v2/openapi.json.

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

GIFs and videos on other websites

What a member shares and also allows on other websites, any website can show: the search with anywhere=true finds it, and its embed has the addresses. If the member takes it back, it disappears there within minutes.

Uploading in pieces

Start first, then send the file in pieces. Split a larger file into pieces of piece bytes, with offset at each one’s place. After the last piece you get the finished GIF or video.

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": { … } } }

Embedding

The player shows the GIF in a loop or the video with controls, below it the name and who shared it. Put the code from embed.code into the page:

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

Forums and programs that know oEmbed fetch the code themselves when given the player’s address:

https://tellmelo.com/api/oembed?url=https%3A%2F%2Ftellmelo.com%2Fmedia-embed%2Fb2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918

The key belongs on your server, never in a web page’s code. Search and upload through your server; the addresses in embed need no key.

GIF picker for your website

With a site key (Developer area → GIF picker for your website) your website gets a ready-made search: two lines in the page, and a click on the button opens it. The key is public and only works on the addresses you enter for it. The picker only shows what members allowed on other websites.

<script src="https://tellmelo.com/picker.js" data-key="tmsk_…" defer></script>
<button type="button" data-tellmelo-picker>GIF</button>

When something is picked, the button fires tellmelo:pick with the item: code to embed it, file, poster, name and author. With data-target="#field" it puts code straight into a text field, with data-kind="video" it searches videos. If you embed the file yourself, show the name of the person who shared it.

document.addEventListener('tellmelo:pick', (event) => {
  const { code, file, name, author } = event.detail;
});

Sign in with tellmelo

Other sites let members sign in with their tellmelo account over OpenID Connect (authorization code with PKCE). The site receives only the username, the confirmed email address and an identifier of its own per member (sub).

You apply for an app under “Developer area → Sign in with tellmelo”. The team checks every app; afterwards you see the client ID there and, for apps with a server, create the client secret, which is shown once.

Everything a library needs is in the discovery document:

https://tellmelo.com/.well-known/openid-configuration
  1. Send the member to /oauth/authorize with response_type=code, client_id, redirect_uri (exactly as registered), scope=openid profile email, state, nonce and code_challenge with code_challenge_method=S256.
  2. Exchange the code within a minute at /oauth/token: grant_type=authorization_code, code, redirect_uri and code_verifier; apps with a server also send the secret, with Basic authentication or in the form.
  3. The ID token (RS256, keys at /oauth/jwks) contains sub, with profile also preferred_username, with email also email and email_verified. The access token is valid for 10 minutes and only reads /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
}

There are no refresh tokens: tellmelo signs members in and grants no lasting access. If a member removes the site or the team suspends the app, /oauth/userinfo answers 401 at once. prompt=none checks without a page, prompt=consent asks again.

What we expect

The same rules apply as everywhere: no harassment, no spam, no content you have no rights to. You are responsible for what your key posts.

Show other members’ GIFs and videos on your website only when they have embed, through those addresses and with the name of whoever shared them. Once something is no longer available, stop showing it. Don’t copy the files into a collection of your own.

ImprintPrivacyTerms of useStatusApps