tellmelo.EntwicklerZu tellmelo
Hilfe-CenterSupportRechtlichesEntwickler

API

Einstieg

  • Ich will …
  • Überblick
  • Schnellstart
  • Ausprobieren
  • Dein Schlüssel
  • Was ein Schlüssel darf
  • Bots

Grundlagen

  • Anfragen und Antworten
  • Seiten
  • Nur das Neue
  • Grenzen
  • Header
  • Wenn etwas nicht geht
  • Versionen

Endpunkte

  • Endpunkte
  • Der Einstieg
    • GET /
  • Beiträge
    • 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
  • Antworten
    • 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}
  • Umfragen
    • POST /posts/{id}/vote
  • Profile
    • 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
  • Gruppen
    • 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
  • Kanäle
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gruppen verwalten
    • 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
  • Entdecken
    • GET /tags
    • GET /search
    • GET /emojis
  • GIFs und Videos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Dein Konto
    • 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
  • Mitteilungen
    • GET /notifications
    • POST /notifications/read
  • Nachrichten
    • 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}
  • Beziehungen
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Sammlungen
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Geschenke
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objekte

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

Weiteres

  • Die maschinenlesbare Beschreibung
  • GIFs und Videos auf anderen Websites
  • Mit tellmelo anmelden
  • Was wir erwarten
Inhalt

Einstieg

  • Ich will …
  • Überblick
  • Schnellstart
  • Ausprobieren
  • Dein Schlüssel
  • Was ein Schlüssel darf
  • Bots

Grundlagen

  • Anfragen und Antworten
  • Seiten
  • Nur das Neue
  • Grenzen
  • Header
  • Wenn etwas nicht geht
  • Versionen

Endpunkte

  • Endpunkte
  • Der Einstieg
    • GET /
  • Beiträge
    • 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
  • Antworten
    • 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}
  • Umfragen
    • POST /posts/{id}/vote
  • Profile
    • 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
  • Gruppen
    • 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
  • Kanäle
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gruppen verwalten
    • 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
  • Entdecken
    • GET /tags
    • GET /search
    • GET /emojis
  • GIFs und Videos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Dein Konto
    • 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
  • Mitteilungen
    • GET /notifications
    • POST /notifications/read
  • Nachrichten
    • 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}
  • Beziehungen
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Sammlungen
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Geschenke
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objekte

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

Weiteres

  • Die maschinenlesbare Beschreibung
  • GIFs und Videos auf anderen Websites
  • Mit tellmelo anmelden
  • Was wir erwarten

Ich will …

Wähl aus, was du vorhast; darunter stehen nur die Schritte dafür. Die vollständige Referenz folgt weiter unten.

  1. Erstelle den Bot in einer deiner Gruppen im Gruppenmenü unter „Bots → Meine Bots“, mit Bild, Name und @Name. Sein Token siehst du nur einmal.
  2. Teile seinen Link „Bot hinzufügen“ oder reiche ihn für das Bot-Verzeichnis ein, wo er nach der Prüfung durch das Team steht; wer in einer Gruppe Rollen verwalten darf, nimmt ihn mit den Rechten auf, denen er zustimmt.
  3. Empfange, was in seinen Gruppen geschieht, als Strom (GET /v2/events/stream) oder an deine Adresse, und schreib mit POST /v2/channels/{id}/messages. Mehr unter Bots.
  4. Melde Befehle an (PUT /v2/me/commands) und antworte mit Karten und Knöpfen; Musik spielt ein Bot mit einem Platz im Sprachkanal (POST /v2/channels/{id}/voice).

Überblick

Mit v2 sprechen eigene Programme mit tellmelo: ein Schlüssel je Anfrage, JSON zurück, jede Liste blättert gleich. Es gelten dieselben Regeln wie in der App.

  • Jeder Pfad beginnt mit https://api.tellmelo.com/v2.
  • Anfragen und Antworten sind JSON in UTF-8. Feldnamen, Codes und Werte sind englisch und bleiben es.
  • Ein Schlüssel handelt als dein Konto: Was du in der App nicht sehen kannst, kann er auch nicht lesen.
https://api.tellmelo.com/v2

Schnellstart

  1. Leg unter „Developer-Bereich → API“ einen Schlüssel an und kopier ihn. Er wird nur ein einziges Mal gezeigt.
  2. Frag damit die Wurzel ab. Die Antwort nennt Version, Rechte des Schlüssels und die restlichen Anfragen dieser Minute.
  3. Jeder Pfad funktioniert gleich: Schlüssel im Header, JSON zurück, bei Listen items und next.
curl -H "Authorization: Bearer tm_key_…" https://api.tellmelo.com/v2
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

Weiter mit /me für dein Profil, /posts für Öffentliches, /feed für deinen Feed.

Ausprobieren

Wähl eine Aufgabe, füll die Felder aus und kopier die Anfrage oder schick sie hier ab. Schreiben fragt vorher nach. Der Code liest den Schlüssel aus TELLMELO_KEY.

read API-Version und Name dieser Instanz.

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

Dein Schlüssel

Bis zu 10 Schlüssel je Konto, jeder mit Namen, eigenen Rechten und auf Wunsch einem Ablaufdatum. Ein Schlüssel beginnt mit tm_key_ und wird nur einmal gezeigt. Verloren? Erneuere ihn, der alte Wert gilt dann nicht mehr.

Du legst ihn unter „Developer-Bereich → API“ an. Er geht im Header der Anfrage mit:

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

Oder, wenn das bequemer ist, in einem eigenen Header:

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

Nicht in der Adresszeile: Dort landet er in Protokollen und im Browserverlauf.

Derselbe Schlüssel lädt auch Bilder: Jede url zeigt auf /api/media; schick den Schlüssel dort ebenfalls im Header mit.

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

Was ein Schlüssel darf

Ein Schlüssel kann immer lesen und, wenn du es erlaubst, auch schreiben, verschenken, Medien hochladen und Gruppen verwalten. Jeder Pfad unten sagt, was er braucht:

  • read: lesen. Öffentliche Beiträge, Profile, Gruppen und Tags, dazu dein Feed, deine Mitteilungen, Nachrichten und die Kanäle deiner Gruppen.
  • write: handeln. Veröffentlichen, antworten, abstimmen, Nachrichten senden, im Chat einer Gruppe schreiben, folgen, beitreten, blockieren, Mitteilungen als gelesen markieren.
  • gifts: verschenken. Aus dem Kontingent eines Partners an ein Mitglied und Geschenke unter einem neuen Beitrag. Ein eigenes Recht, damit ein Schlüssel zum Posten nie etwas verschenken kann.
  • media: die eigene Mediathek. GIFs und Videos hochladen, ändern, teilen und entfernen. Ein eigenes Recht, weil Uploads die Videopunkte des Kontos kosten. Geteilte GIFs und Videos finden braucht nur read.
  • groups: Gruppen verwalten. Rollen, Kanäle, Kategorien, Einladungslinks, den Feed-Kanal, das Entfernen, Timeouts, Kicks und Banns, so weit dein Konto das in der Gruppe darf. Ein eigenes Recht, damit ein Schlüssel zum Posten nie ändert, wer in einer Gruppe was darf.

Was kein Schlüssel kann

Kein Schlüssel kommt an Passwort, E-Mail-Adresse, Kontotyp, Ort, Rolle, Löschung, Sitzungen, Push-Geräte oder andere Schlüssel, und auch nicht an Verwaltung oder Gruppenleitung. Was das Passwort schützt, kann kein Schlüssel.

Bots

Ein Bot ist ein eigenes Konto der Art bot für Gruppen: ohne Passwort und E-Mail-Adresse, gesteuert von deinem Programm mit seinem eigenen Schlüssel. Er nutzt dieselbe API wie jedes Konto und kann in Gruppen alles, was seine Rolle dort erlaubt.

  1. In einer deiner Gruppen im Gruppenmenü unter „Bots → Meine Bots“ einen Bot mit Bild, Titelbild, Name, Benutzername und Beschreibung anlegen. Das Token wird nur einmal angezeigt; es hat die Rechte read, write, media und groups.
  2. Den Link des Bots weitergeben oder ihn für das Bot-Verzeichnis einreichen; dort steht er, sobald das Team ihn geprüft hat. Wer in einer Gruppe Rollen verwalten darf, wählt die Rechte; der Bot tritt bei und bekommt eine eigene Rolle.
  3. Dein Programm schickt das Token als Authorization: Bearer …, liest die Ereignisse seiner Gruppen als Strom und arbeitet mit den Routen unter Bots, Kanäle und Gruppen.

Ein kleiner Bot, der die Ereignisse als Strom liest und auf den Befehl /ping mit pong antwortet, nur für den Fragenden:

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

Derselbe Bot in Python, der die Ereignisse Seite für Seite holt:

# 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)
  • Was ein Bot in einer Gruppe darf, bestimmt seine Rolle dort, nicht das Token. Die Rolle trägt seinen Namen; die Gruppe ändert ihre Rechte bei den Rollen in den Gruppen-Einstellungen und entfernt den Bot im Gruppenmenü unter „Bots → In dieser Gruppe“.
  • Bis zu 5 Bots je Konto; je Gruppe so viele, wie ihre Vorteile erlauben. Ein Bot schreibt höchstens 30 Nachrichten pro Minute und Gruppe, ist nicht über die Suche zu finden und schreibt nur Leuten, die ihm zuerst geschrieben haben. Es gelten die Grenzen.
  • Ereignisse kommen auch an eine eigene HTTPS-Adresse (signiert wie die Webhooks, mit Wiederholungen). Dazu Befehle (PUT /v2/me/commands) mit Antworten für alle oder nur den Fragenden, Karten und Knöpfe in Nachrichten und Musik im Sprachkanal (POST /v2/channels/{id}/voice): alles unter Bots.

Anfragen und Antworten

  • Überall JSON. Jede Antwort ist application/json in UTF-8, Fehler eingeschlossen. Nur Bilder kommen als Bilder.
  • Was du schickst. Ein POST trägt seine Felder als JSON im Körper. Steht ein Feld auch in der Adresse, gilt der Körper.
  • Zeiten sind Millisekunden seit dem 1. Januar 1970, UTC.
  • IDs sind Zeichenketten. Vergleich sie nur als Ganzes.
  • Jedes Feld ist immer da. Was fehlt, ist null; Listen sind notfalls leer.
  • Texte sind reiner Text, genau wie geschrieben. #tags, @namen und Links bleiben, wie sie sind, ebenso die eigenen Emojis der Instanz als :name:; ihre Bilder stehen unter /emojis.
  • Bilder sind relative Adressen, /api/media?id=…. Ohne Schlüssel im Header kommt 401.

Seiten

Jede Liste nimmt limit und cursor und antwortet mit items und next. Schick das next als cursor zurück, um weiterzublättern; ist next leer, ist Schluss. Der Cursor ist undurchsichtig: nicht auseinandernehmen, nicht selbst bauen.

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

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

Ohne limit 20 Einträge, höchstens 50. Manche Listen blättern nicht, ihr next ist immer null.

Nur das Neue

Jede Antwort trägt ein ETag. Schick es beim nächsten Mal als If-None-Match mit: Hat sich nichts geändert, kommt 304 ohne Inhalt.

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

Ausnahmen: /feed hat kein ETag, weil sich die Reihenfolge ständig ändert, und Schreibzugriffe antworten nie 304.

Grenzen

Ein Schlüssel darf 120 Anfragen je Minute stellen, mit dem Abo „Organisation“ 600, sofern die Verwaltung nichts anderes festlegt. Darüber kommt 429, und nichts wurde ausgeführt. Warte eine Minute und schick die Anfrage erneut.

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

Schreibzugriffe zählen außerdem gegen die Grenzen der App, etwa wie viele Beiträge in wenigen Minuten. Auch dann kommt 429 mit rate_limited.

Header

Außer dem Schlüssel ist kein Header Pflicht.

Was du schickst

HeaderBedeutung
AuthorizationTrägt den Schlüssel: Bearer tm_key_…. Der übliche Weg.
X-Tellmelo-KeyDer Schlüssel, als Alternative zu Authorization.
Content-Typeapplication/json, für eine Anfrage mit Körper.
If-None-MatchDas ETag der letzten Antwort. Hat sich seitdem nichts geändert, lautet die Antwort 304 ohne Körper.

Was zurückkommt

HeaderBedeutung
ETagDer Fingerabdruck dieser Antwort (W/). Schick ihn als If-None-Match zurück.
X-RateLimit-LimitWie viele Anfragen dieser Schlüssel je Minute stellen darf.
X-RateLimit-RemainingWie viele davon in der laufenden Minute übrig sind.
X-RateLimit-ResetWann die nächste Minute beginnt, in Sekunden seit 1970, UTC.
X-Tellmelo-ScopeWas dieser Schlüssel darf: read oder read write.
Retry-AfterBei 429: wie viele Sekunden du warten solltest, bevor du wieder fragst.
WWW-AuthenticateBei 401 ohne Schlüssel: Bearer.
Cache-Controlno-store: Kein Proxy darf eine Antwort zwischenspeichern. Mit dem ETag prüfen darfst du trotzdem.

Wenn etwas nicht geht

Fehler kommen als JSON: ein fester englischer Code in error für dein Programm und ein Satz in message für Menschen, dazu der passende Statuscode. Vergleich nur den Code, der Satz kann sich ändern.

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

Manche Fehler bringen ein Feld mehr mit: docs bei 401 wegen eines fehlenden Schlüssels, limit bei 429.

StatusCodeBedeutung
400bad_requestDie Anfrage ist nicht lesbar, ein Pflichtfeld fehlt oder ein Wert ist nicht erlaubt.
401key_missingKein Schlüssel im Header.
401key_invalidDer Schlüssel gilt nicht: vertippt, ersetzt oder das Konto ist gesperrt.
401unauthorizedAls nicht angemeldet abgewiesen, aus einem anderen Grund als dem Schlüssel.
403scope_missingDem Schlüssel fehlt das nötige Recht, meist write.
403account_data_lockedKontodaten wie Passwort, E-Mail-Adresse oder Löschung sind für Schlüssel gesperrt.
403forbiddenDein Konto darf das nicht, zum Beispiel wegen eines entzogenen Rechts oder einer Blockierung.
403timed_outEin Timeout schaltet dein Konto in dieser Gruppe gerade stumm.
404unknown_pathDiesen Pfad gibt es nicht, oder nicht mit dieser Methode.
404not_foundNicht gefunden, oder du darfst es nicht sehen.
409conflictEs kollidiert mit etwas, das schon da ist, zum Beispiel ein vergebener Name.
409feed_offDer Feed-Kanal dieser Gruppe ist aus.
413too_largeZu groß für diese Instanz.
422unprocessableLesbar, aber in dieser Form nicht möglich.
429rate_limitedZu viele Anfragen. Nichts ist passiert; warte und versuch es noch einmal.
500internal_errorFehler auf dem Server.

Versionen

Die Version steht im Pfad. Solange dort v2 steht, bleiben Pfade und Felder gleich; Neues kommt nur dazu.

Ergänzungen erhöhen die zweite Zahl. Jeder Pfad nennt, seit wann es ihn gibt.

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/ gibt es nicht mehr: Die alten Pfade antworten 410 und nennen im Rumpf den neuen Weg.

Endpunkte

Alle Pfade auf einen Blick, danach jeder einzeln mit Beispiel.

WegRechtWozu
Der Einstieg
GET/v2readAPI-Version und Name dieser Instanz.
Beiträge
GET/v2/postsreadDie öffentlichen Beiträge, neueste zuerst.
GET/v2/posts/{id}readEin einzelner Beitrag, über seine id.
POST/v2/postswriteEinen Beitrag veröffentlichen.
DELETE/v2/posts/{id}writeEinen eigenen Beitrag entfernen.
GET/v2/me/scheduledreadDeine Beiträge, die noch nicht erschienen sind, und worauf sie warten.
POST/v2/posts/{id}/schedulewriteÄndern, wann ein geplanter Beitrag erscheint oder wann sich ein Beitrag von selbst löscht.
POST/v2/posts/{id}/editwriteDen Text eines eigenen Beitrags ändern.
GET/v2/posts/{id}/reply-settingsreadWer auf einen eigenen Beitrag antworten darf, ob Antworten auf Freigabe warten und der langsame Modus.
PUT/v2/posts/{id}/reply-settingswriteDie Antwort-Einstellungen eines eigenen Beitrags ändern. Was du nicht angibst, bleibt.
POST/v2/posts/{id}/coauthorwriteEine Einladung als Co-Autor annehmen oder ablehnen.
DELETE/v2/posts/{id}/coauthorwriteAls Co-Autor zurücktreten oder als Verfasser den Co-Autor vom Beitrag nehmen.
POST/v2/posts/{id}/pinwriteEinen eigenen Beitrag oben im Profil anheften oder lösen.
Antworten
GET/v2/posts/{id}/repliesreadDie Antworten auf einen Beitrag, ohne geblockte Konten.
POST/v2/posts/{id}/replieswriteAuf einen Beitrag antworten.
POST/v2/replies/{id}/editwriteDen Text einer eigenen Antwort ändern.
DELETE/v2/replies/{id}writeEine eigene Antwort entfernen.
POST/v2/replies/{id}/likewriteEine Antwort hochvoten (ein „Gefällt mir“ ist seit den Votes auf Antworten ein Upvote) oder den Upvote zurücknehmen; ein Downvote bleibt.
POST/v2/replies/{id}/votewriteEine Antwort hoch- oder runtervoten oder die eigene Stimme zurücknehmen. Antwortet mit der eigenen Stimme und der Wertung danach.
POST/v2/replies/{id}/pickwriteUnter dem eigenen Beitrag eine Antwort als beste hervorheben oder die Hervorhebung zurücknehmen.
GET/v2/posts/{id}/replies/waitingreadDie Antworten, die unter einem Beitrag auf Freigabe warten: unter dem eigenen alle, sonst nur die eigenen.
POST/v2/replies/{id}/decidewriteEine wartende Antwort unter dem eigenen Beitrag freigeben oder ablehnen. Abgelehnt wird sie gelöscht.
GET/v2/posts/{id}/replies/plannedreadDie eigenen Antworten, die unter einem Beitrag für später geplant sind.
PUT/v2/me/planned-replies/{id}writeText oder Zeit einer geplanten Antwort ändern. Eine fehlgeschlagene wartet danach wieder.
POST/v2/me/planned-replies/{id}/sendwriteEine geplante Antwort sofort senden.
DELETE/v2/me/planned-replies/{id}writeEine geplante Antwort löschen.
Umfragen
POST/v2/posts/{id}/votewriteAn einer Umfrage teilnehmen.
Profile
GET/v2/profiles/{handle}readEin Profil, über sein Kürzel.
GET/v2/profiles/{handle}/postsreadDie öffentlichen Beiträge eines Profils, neueste zuerst.
GET/v2/profiles/{handle}/eventsreadDie anstehenden Termine eines Profils, die nächsten zuerst.
POST/v2/me/eventswriteEinen Termin anlegen. Antwortet mit seiner id.
PUT/v2/me/events/{id}writeEinen eigenen Termin ändern. Alle Felder werden neu gesetzt.
DELETE/v2/me/events/{id}writeEinen eigenen Termin löschen.
GET/v2/me/events/{id}/signupsreadWer sich für einen deiner Termine angemeldet hat.
POST/v2/events/{id}/signupwriteDich für einen Termin an- oder abmelden.
Gruppen
GET/v2/communitiesreadDie offenen Gruppen dieser Instanz; mit mine=true die Gruppen deines Kontos.
GET/v2/communities/{id}readEine einzelne Gruppe, über ihre id.
GET/v2/communities/{id}/postsreadDie Beiträge des Feed-Kanals einer Gruppe, neueste zuerst.
GET/v2/communities/{id}/membersreadDie Mitglieder einer Gruppe mit ihren Rollen.
GET/v2/communities/{id}/rolesreadDie Rollen einer Gruppe, die höchste zuerst, @everyone zuletzt.
GET/v2/communities/{id}/bellreadWelche Mitteilungen dir eine Gruppe schickt.
GET/v2/invites/{code}readDie Gruppe hinter einem Einladungslink, vor dem Beitritt.
PUT/v2/roles/{id}/selfwriteEine selbst wählbare Rolle nehmen oder ablegen.
GET/v2/communities/{id}/emojisreadDie eigenen Emojis einer Gruppe.
PUT/v2/communities/{id}/bellwriteEinstellen, welche Mitteilungen dir eine Gruppe schickt.
POST/v2/invites/{code}/joinwriteMit einem Einladungslink einer Gruppe beitreten.
GET/v2/communities/{id}/botsreadDie Bots einer Gruppe mit dem, was ihre Rolle erlaubt.
Kanäle
GET/v2/communities/{id}/channelsreadDie Kanäle einer Gruppe, die du siehst, in ihrer Reihenfolge.
GET/v2/channels/{id}/messagesreadDie Nachrichten eines Chat-Kanals, neueste zuerst.
POST/v2/channels/{id}/messageswriteEine Nachricht in einem Chat-Kanal schreiben.
POST/v2/channels/{id}/readwriteEinen Chat-Kanal bis zu einem Zeitpunkt als gelesen markieren.
DELETE/v2/channel-messages/{id}writeEine eigene Nachricht in einem Chat-Kanal löschen.
GET/v2/communities/{id}/voicereadWer gerade in den Sprachkanälen einer Gruppe ist, je Kanal.
Gruppen verwalten
POST/v2/communities/{id}/emojisgroupsDer Gruppe ein Emoji geben.
DELETE/v2/communities/{id}/emojis/{name}groupsEin Emoji der Gruppe entfernen.
POST/v2/communities/{id}/rolesgroupsEine Rolle anlegen.
PUT/v2/roles/{id}groupsName, Farbe und Rechte einer Rolle ändern.
DELETE/v2/roles/{id}groupsEine Rolle löschen.
PUT/v2/communities/{id}/roles/ordergroupsDie Rangfolge der Rollen festlegen.
PUT/v2/roles/{id}/members/{member}groupsEinem Mitglied eine Rolle geben oder nehmen.
POST/v2/communities/{id}/channelsgroupsEinen Chat-Kanal anlegen.
PUT/v2/channels/{id}groupsName, Thema und Kategorie eines Kanals ändern.
DELETE/v2/channels/{id}groupsEinen Chat-Kanal mit seinen Nachrichten löschen.
PUT/v2/communities/{id}/channels/ordergroupsDie Reihenfolge der Kategorien und Chat-Kanäle festlegen.
PUT/v2/communities/{id}/channels/shapegroupsDie Form aller Kanal-Symbole der Gruppe festlegen.
GET/v2/channels/{id}/overridesgroupsWas Rollen in einem Kanal anders dürfen als in der Gruppe.
PUT/v2/channels/{id}/overrides/{role}groupsFestlegen, was eine Rolle in einem Kanal anders darf.
POST/v2/communities/{id}/categoriesgroupsEine Kategorie für Kanäle anlegen.
PUT/v2/categories/{id}groupsEine Kategorie umbenennen.
DELETE/v2/categories/{id}groupsEine Kategorie löschen.
PUT/v2/communities/{id}/feedgroupsDen Feed-Kanal einer Gruppe ein- oder ausschalten.
GET/v2/communities/{id}/invitesgroupsDie Einladungslinks einer Gruppe, die noch gelten.
POST/v2/communities/{id}/invitesgroupsEinen Einladungslink erstellen.
DELETE/v2/invites/{code}groupsEinen Einladungslink zurücknehmen.
POST/v2/channel-messages/{id}/removegroupsDie Nachricht eines anderen Mitglieds aus einem Kanal entfernen.
POST/v2/communities/{id}/posts/{post}/removegroupsEinen Beitrag aus einer Gruppe entfernen.
DELETE/v2/communities/{id}/members/{member}groupsEin Mitglied aus einer Gruppe kicken.
PUT/v2/communities/{id}/members/{member}/timeoutgroupsEin Mitglied stummschalten.
DELETE/v2/communities/{id}/members/{member}/timeoutgroupsEinen Timeout aufheben.
GET/v2/communities/{id}/bansgroupsDie laufenden Banns einer Gruppe.
PUT/v2/communities/{id}/bans/{member}groupsEin Mitglied bannen.
DELETE/v2/communities/{id}/bans/{member}groupsEinen Bann aufheben.
GET/v2/communities/{id}/loggroupsDas Protokoll der Leitung: wer was entfernt hat und warum.
POST/v2/communitiesgroupsEine Gruppe gründen. Antwortet mit ihrer id; du bist ihr Gründer.
PUT/v2/communities/{id}groupsEine Gruppe ändern, die du leitest. Was du nicht angibst, bleibt.
Bots
GET/v2/eventsreadDie Ereignisse aus den Gruppen des Bots seit einem Ereignis, Seite für Seite.
GET/v2/events/streamreadDie Ereignisse aus den Gruppen des Bots, sobald sie geschehen (Server-Sent Events).
GET/v2/me/commandsreadDie Befehle des Bots.
PUT/v2/me/commandswriteDie Befehle des Bots festlegen, alle auf einmal.
POST/v2/interactions/{id}/replywriteAuf einen Befehl oder Knopf antworten.
POST/v2/channels/{id}/voicewriteEinen Platz im Sprachkanal nehmen, um Musik oder Ton abzuspielen.
Entdecken
GET/v2/tagsreadDie Tags, die gerade laufen.
GET/v2/searchreadEine Suche über Beiträge, Namen, Kürzel und Tags.
GET/v2/emojisreadDie eigenen Emojis der Instanz, mit der Adresse ihrer Bilder.
GIFs und Videos
GET/v2/mediareadGeteilte GIFs oder Videos, die meistgenutzten zuerst.
GET/v2/media/minemediaDeine eigene Mediathek, das Neueste zuerst.
GET/v2/media/{id}readEin GIF oder Video, deines oder ein geteiltes.
POST/v2/media/uploadsmediaEin Hochladen beginnen.
PUT/v2/media/uploads/{upload}mediaEin Stück der Datei senden.
POST/v2/media/{id}mediaEines deiner GIFs oder Videos ändern.
DELETE/v2/media/{id}mediaEines deiner GIFs oder Videos entfernen.
Dein Konto
GET/v2/mereadDein eigenes Profil, mit der id, die die anderen Wege erwarten.
GET/v2/feedreadDein eigener Feed, so wie die Anwendung ihn zusammenstellt.
POST/v2/me/pictureswriteEin Bild hochladen, als seine Bytes. Antwortet mit id und url; die id nimmst du dann als Profilbild, Titelbild oder für einen Beitrag.
PUT/v2/me/profileprofileDein Profil ändern: Name, Über dich, Profilbild, Titelbild und Profilfarbe. Was du nicht angibst, bleibt.
GET/v2/me/emojisreadDeine eigenen Emojis.
POST/v2/me/emojis/picturesprofileDas Bild für ein eigenes Emoji hochladen, als seine Bytes.
POST/v2/me/emojisprofileEin eigenes Emoji anlegen. Antwortet mit allen deinen Emojis.
DELETE/v2/me/emojis/{name}profileEin eigenes Emoji entfernen. Antwortet mit den übrigen.
PUT/v2/me/emojis/sharingprofileFestlegen, ob deine Follower deine Emojis in eigenen Texten nutzen dürfen.
GET/v2/me/webhookswebhooksDeine Webhooks mit ihrem Stand.
POST/v2/me/webhookswebhooksEinen Webhook anlegen. Antwortet mit id und dem Geheimnis für die Signaturen, nur dieses eine Mal.
DELETE/v2/me/webhooks/{id}webhooksEinen Webhook löschen.
POST/v2/me/webhooks/{id}/testwebhooksEine Probe an einen Webhook senden.
Mitteilungen
GET/v2/notificationsreadDeine Mitteilungen, neueste zuerst.
POST/v2/notifications/readwriteDeine Mitteilungen als gelesen markieren.
Nachrichten
GET/v2/conversationsreadDein Postfach: eine Zeile je Gespräch, das jüngste zuerst.
GET/v2/conversations/{with}/messagesreadDie Nachrichten eines Gesprächs, neueste zuerst.
POST/v2/conversations/{with}/messageswriteEine Nachricht in einem Gespräch senden.
POST/v2/conversations/{with}/readwriteAlle Nachrichten eines Gesprächs als gelesen markieren.
DELETE/v2/conversations/{with}/messages/{id}writeEine eigene Nachricht löschen.
POST/v2/conversations/{with}/plannedwriteEine Nachricht für später planen. Antwortet mit der id der geplanten Nachricht.
GET/v2/me/planned-messagesreadDie eigenen Nachrichten, die noch gesendet werden, nach Zeit geordnet.
POST/v2/me/planned-messages/{id}/sendwriteEine zurückgehaltene oder fehlgeschlagene geplante Nachricht jetzt senden.
DELETE/v2/me/planned-messages/{id}writeEine geplante Nachricht löschen, bevor sie gesendet wird.
Beziehungen
POST/v2/relationswriteMögen, merken, teilen, folgen, beitreten, blockieren, stummschalten, je nach kind.
GET/v2/profiles/{handle}/followersreadWer einem Profil folgt, die neuesten zuerst.
GET/v2/profiles/{handle}/followingreadWem ein Profil folgt, die neuesten zuerst.
GET/v2/me/relationsreadWen du blockiert, stummgeschaltet oder nur für Nachrichten blockiert hast, die neuesten zuerst.
Sammlungen
GET/v2/me/collectionsreadDeine Sammlungen mit der Zahl ihrer Beiträge.
POST/v2/me/collectionswriteEine Sammlung anlegen. Antwortet mit ihrer id.
PUT/v2/me/collections/{id}writeEine Sammlung umbenennen.
DELETE/v2/me/collections/{id}writeEine Sammlung löschen.
GET/v2/me/collections/{id}/postsreadDie Beiträge einer Sammlung, wie im Reiter „Gemerkt“.
POST/v2/me/collections/{id}/postswriteEinen Beitrag in eine Sammlung legen oder herausnehmen.
Geschenke
GET/v2/partner/quotareadWie viel noch in deinem Kontingent zum Verschenken steckt.
GET/v2/partner/giftsreadWas du aus dem Kontingent verschenkt hast, an wen und wann – das Neueste zuerst.
POST/v2/partner/giftsgiftsAbo-Monate oder Funken aus deinem Kontingent an ein Mitglied verschenken.
GET/v2/gift-dropsreadDeine Geschenke unter Beiträgen: wie viele Plätze noch frei sind und wie sie bezahlt wurden.
POST/v2/gift-dropsgiftsEinen Beitrag mit Geschenken zum Abholen veröffentlichen.

Der Einstieg

Die erste Anfrage jedes Programms: Funktioniert der Schlüssel, und was darf er?

GET/v2

API-Version und Name dieser Instanz.

  • Recht read
  • mit ETag
  • seit v2.0

Ohne Schrägstrich am Ende: https://api.tellmelo.com/v2/ leitet mit 308 auf https://api.tellmelo.com/v2 um, und nicht jedes Programm folgt.

Beispielanfrage

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

Antwort

Antwortet mit einem Service.

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

Mögliche Status: 200304401429

Beiträge

Öffentliche Beiträge lesen, eigene veröffentlichen und wieder entfernen.

GET/v2/posts

Die öffentlichen Beiträge, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Auf öffentlichen Pfaden sind counts.likes und counts.reposts immer 0 und pinned ist false.

Beiträge in Gruppen stehen nicht hier, sondern unter /communities/{id}/posts.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Post, als `items` und `next`.

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

Mögliche Status: 200304401429

GET/v2/posts/{id}

Ein einzelner Beitrag, über seine id.

  • Recht read
  • mit ETag
  • seit v2.0

Auf öffentlichen Pfaden sind counts.likes und counts.reposts immer 0 und pinned ist false.

Beiträge in Gruppen stehen nicht hier, sondern unter /communities/{id}/posts.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einem Post.

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

Mögliche Status: 200304400401404429

POST/v2/posts

Einen Beitrag veröffentlichen.

  • Recht write
  • seit v2.0

Ein Beitrag braucht Text oder eine Umfrage. Länge, Antworten einer Umfrage und Tempo legt die Instanz fest; darüber kommt 400 oder 429.

Bilder, ein GIF oder ein Video mit media anhängen. Ein GIF oder Video steht allein. Geteilte GIFs und Videos anderer darfst du auf tellmelo verwenden.

Ein Beitrag für enge Freunde oder mit Co-Autor erscheint sofort, nicht in einer Gruppe und nicht geplant. Beides zugleich geht nicht.

Parameter

NameTypBedeutung
textim KörperstringfreiwilligDer Text des Beitrags, der Antwort oder der Nachricht.
communityim KörperstringfreiwilligDie id der Gruppe, in deren Feed-Kanal der Beitrag geht; er muss an sein, und du brauchst das Recht dazu. Ohne sie steht der Beitrag außerhalb jeder Gruppe.
quotesim KörperstringfreiwilligDie id des Beitrags, den dieser zitiert.
pollim Körperstring[]freiwilligDie Antwortmöglichkeiten als Liste von Texten.
mediaim Körperstring[]freiwilligIDs von Bildern, die in der App hochgeladen wurden, oder eines GIFs oder Videos aus der Mediathek (seit 2.14).
audienceim KörperstringfreiwilligWer den Beitrag sieht: everyone alle, die ihn sehen dürfen, close nur deine engen Freunde.everyoneclose
coauthorim KörperstringfreiwilligDie id eines Kontos, das du als Co-Autor einlädst. Ihr müsst euch gegenseitig folgen.

Beispielanfrage

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"

Antwort

Antwortet mit einem Created.

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

Mögliche Status: 200400401403429

DELETE/v2/posts/{id}

Einen eigenen Beitrag entfernen.

  • Recht write
  • seit v2.0

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/me/scheduled

Deine Beiträge, die noch nicht erschienen sind, und worauf sie warten.

  • Recht read
  • mit ETag
  • seit v2.12

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ScheduledPost, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/posts/{id}/schedule

Ändern, wann ein geplanter Beitrag erscheint oder wann sich ein Beitrag von selbst löscht.

  • Recht write
  • seit v2.12

Nur eigene Beiträge. Solange die Geschenke eines Beitrags nicht bezahlt sind, lässt er sich nicht planen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
publishAtim KörperintegerfreiwilligWann der geplante Beitrag erscheint, in Millisekunden seit 1970.
deleteAtim KörperintegerfreiwilligWann sich der Beitrag von selbst löscht, in Millisekunden seit 1970.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/posts/{id}/edit

Den Text eines eigenen Beitrags ändern.

  • Recht write
  • seit v2.12

Nur innerhalb der Zeit zum Bearbeiten, die dein Abo vorgibt. Geplante Beiträge lassen sich nicht bearbeiten.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
textim KörperstringPflichtDer Text des Beitrags, der Antwort oder der Nachricht.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Wer auf einen eigenen Beitrag antworten darf, ob Antworten auf Freigabe warten und der langsame Modus.

  • Recht read
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einem ReplySettings.

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

Mögliche Status: 200304400401404429

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

Die Antwort-Einstellungen eines eigenen Beitrags ändern. Was du nicht angibst, bleibt.

  • Recht write
  • seit v2.19

Nur eigene Beiträge.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
audienceim KörperstringfreiwilligWer antworten darf: alle, Konten, denen du folgst, Erwähnte oder niemand.allfollowingmentionednobody
approvalim KörperbooleanfreiwilligOb Antworten erst nach deiner Freigabe erscheinen.
slowim KörperstringfreiwilligLangsamer Modus: auto schaltet ihn bei vielen Antworten von selbst ein, on immer, off nie.autoonoff

Beispielanfrage

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"

Antwort

Antwortet mit einem ReplySettings.

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

Mögliche Status: 200400401403404429

POST/v2/posts/{id}/coauthor

Eine Einladung als Co-Autor annehmen oder ablehnen.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
acceptim KörperbooleanPflichttrue nimmt die Einladung an, false lehnt sie ab.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

DELETE/v2/posts/{id}/coauthor

Als Co-Autor zurücktreten oder als Verfasser den Co-Autor vom Beitrag nehmen.

  • Recht write
  • seit v2.19

Für den Co-Autor und den Verfasser des Beitrags.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/posts/{id}/pin

Einen eigenen Beitrag oben im Profil anheften oder lösen.

  • Recht write
  • seit v2.19

Nur eigene, sichtbare Beiträge. Wie viele angeheftet sein können, hängt vom Abo ab.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
activeim KörperbooleanPflichttrue heftet den Beitrag an, false löst ihn.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Antworten

Antworten unter einem Beitrag, als Liste mit parentId.

GET/v2/posts/{id}/replies

Die Antworten auf einen Beitrag, ohne geblockte Konten.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Die Liste ist flach und nach Zeit sortiert; parentId macht einen Baum daraus. Eine Seite enthält immer ganze Stränge. Antworten blockierter Konten fehlen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Reply, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/posts/{id}/replies

Auf einen Beitrag antworten.

  • Recht write
  • seit v2.0

Im langsamen Modus geht eine Antwort je Person alle 10 Minuten, sonst kommt 429. Ausgenommen sind der Verfasser und Konten, denen er folgt.

Mit media höchstens ein Bild, GIF oder Video.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
textim KörperstringPflichtDer Text des Beitrags, der Antwort oder der Nachricht.
parentIdim KörperstringfreiwilligDie id der Antwort, auf die diese antwortet. Ohne sie direkt an den Beitrag.
mediaim Körperstring[]freiwilligIDs von Bildern, die in der App hochgeladen wurden, oder eines GIFs oder Videos aus der Mediathek (seit 2.14).
publishAtim KörperintegerfreiwilligWann die Antwort erscheinen soll, in Millisekunden seit 1970. Ohne sie geht sie sofort raus.

Beispielanfrage

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"

Antwort

Antwortet mit einem Created.

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

Mögliche Status: 200400401403404429

POST/v2/replies/{id}/edit

Den Text einer eigenen Antwort ändern.

  • Recht write
  • seit v2.12

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.
textim KörperstringPflichtDer Text des Beitrags, der Antwort oder der Nachricht.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

DELETE/v2/replies/{id}

Eine eigene Antwort entfernen.

  • Recht write
  • seit v2.12

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/replies/{id}/like

Eine Antwort hochvoten (ein „Gefällt mir“ ist seit den Votes auf Antworten ein Upvote) oder den Upvote zurücknehmen; ein Downvote bleibt.

  • Recht write
  • seit v2.12
  • veraltet

Veraltet seit 2.19: Nimm POST /replies/{id}/vote. Diese Route bleibt vorerst erhalten.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.
activeim KörperbooleanPflichttrue setzt die Beziehung, false nimmt sie zurück.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/replies/{id}/vote

Eine Antwort hoch- oder runtervoten oder die eigene Stimme zurücknehmen. Antwortet mit der eigenen Stimme und der Wertung danach.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.
voteim KörperstringPflichtup stimmt hoch, down runter, none nimmt die eigene Stimme zurück.updownnone

Beispielanfrage

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"

Antwort

Antwortet mit einem ReplyVote.

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

Mögliche Status: 200400401403404429

POST/v2/replies/{id}/pick

Unter dem eigenen Beitrag eine Antwort als beste hervorheben oder die Hervorhebung zurücknehmen.

  • Recht write
  • seit v2.19

Nur unter eigenen Beiträgen und nur Antworten direkt auf den Beitrag. Eine neue Hervorhebung ersetzt die alte.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.
activeim KörperbooleanPflichttrue hebt die Antwort hervor, false nimmt die Hervorhebung zurück.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Antworten, die unter einem Beitrag auf Freigabe warten: unter dem eigenen alle, sonst nur die eigenen.

  • Recht read
  • mit ETag
  • seit v2.19

Ob Antworten warten, stellt der Verfasser in den Antwort-Einstellungen ein.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Reply, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/replies/{id}/decide

Eine wartende Antwort unter dem eigenen Beitrag freigeben oder ablehnen. Abgelehnt wird sie gelöscht.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Antwort.
approveim KörperbooleanPflichttrue gibt die Antwort frei, false lehnt sie ab.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die eigenen Antworten, die unter einem Beitrag für später geplant sind.

  • Recht read
  • mit ETag
  • seit v2.19

Geplant wird mit publishAt beim Antworten. Höchstens 20 geplante Antworten zugleich.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von PlannedReply, als `items` und `next`.

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

Mögliche Status: 200304400401404429

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

Text oder Zeit einer geplanten Antwort ändern. Eine fehlgeschlagene wartet danach wieder.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der geplanten Antwort.
textim KörperstringfreiwilligDer Text des Beitrags, der Antwort oder der Nachricht.
publishAtim KörperintegerfreiwilligWann die Antwort erscheinen soll, in Millisekunden seit 1970. Ohne sie geht sie sofort raus.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Eine geplante Antwort sofort senden.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der geplanten Antwort.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Eine geplante Antwort löschen.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der geplanten Antwort.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Umfragen

Eine Umfrage ist ein Beitrag, dessen poll gesetzt ist. Abstimmen hat einen eigenen Pfad.

POST/v2/posts/{id}/vote

An einer Umfrage teilnehmen.

  • Recht write
  • seit v2.0

Die Stimmen je Antwort sind null, bis du abgestimmt hast oder die Umfrage endet. total ist immer da.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
optionim KörperintegerPflichtWelche Antwort, ab 0 gezählt. Bei Mehrfachauswahl einmal je Antwort aufrufen.
retractim Körperbooleanfreiwilligtrue nimmt die Stimme zurück.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Profile

Öffentliche Profile über ihren Kurznamen, und was sie gepostet haben.

GET/v2/profiles/{handle}

Ein Profil, über sein Kürzel.

  • Recht read
  • mit ETag
  • seit v2.0

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils, in beliebiger Groß- und Kleinschreibung.

Beispielanfrage

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

Antwort

Antwortet mit einem Profile.

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

Mögliche Status: 200304400401404429

GET/v2/profiles/{handle}/posts

Die öffentlichen Beiträge eines Profils, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Auf öffentlichen Pfaden sind counts.likes und counts.reposts immer 0 und pinned ist false.

Beiträge in Gruppen stehen nicht hier, sondern unter /communities/{id}/posts.

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils, in beliebiger Groß- und Kleinschreibung.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Post, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/profiles/{handle}/events

Die anstehenden Termine eines Profils, die nächsten zuerst.

  • Recht read
  • mit ETag
  • seit v2.19

Nur solange das Abo des Profils Termine enthält. Zwischen Konten, die sich blockiert haben, nichts.

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils, in beliebiger Groß- und Kleinschreibung.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Event, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/me/events

Einen Termin anlegen. Antwortet mit seiner id.

  • Recht write
  • seit v2.19

Braucht ein Abo mit Terminen, sonst 403. Wie viele anstehen können, hängt vom Abo ab.

Parameter

NameTypBedeutung
titleim KörperstringPflichtDer Titel.
startsAtim KörperintegerPflichtBeginn, in Millisekunden seit 1970.
endsAtim KörperintegerfreiwilligEnde, in Millisekunden seit 1970. Freiwillig.
placeim KörperstringfreiwilligWo er stattfindet.
descriptionim KörperstringfreiwilligEine Beschreibung.
signupsim KörperbooleanfreiwilligOb man sich anmelden kann. Braucht ein Abo mit Anmeldungen.
capacityim KörperintegerfreiwilligWie viele sich höchstens anmelden können. Ohne Angabe ohne Grenze.

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403429

PUT/v2/me/events/{id}

Einen eigenen Termin ändern. Alle Felder werden neu gesetzt.

  • Recht write
  • seit v2.19

Ein Termin, der schon begonnen hat, behält seinen Beginn.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Termins.
titleim KörperstringPflichtDer Titel.
startsAtim KörperintegerPflichtBeginn, in Millisekunden seit 1970.
endsAtim KörperintegerfreiwilligEnde, in Millisekunden seit 1970. Freiwillig.
placeim KörperstringfreiwilligWo er stattfindet.
descriptionim KörperstringfreiwilligEine Beschreibung.
signupsim KörperbooleanfreiwilligOb man sich anmelden kann. Braucht ein Abo mit Anmeldungen.
capacityim KörperintegerfreiwilligWie viele sich höchstens anmelden können. Ohne Angabe ohne Grenze.

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

DELETE/v2/me/events/{id}

Einen eigenen Termin löschen.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Termins.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Wer sich für einen deiner Termine angemeldet hat.

  • Recht read
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Termins.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von EventSignup, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/events/{id}/signup

Dich für einen Termin an- oder abmelden.

  • Recht write
  • seit v2.19

Nur bei Terminen mit Anmeldung, nicht bei den eigenen. Ist er voll, kommt 409.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Termins.
goingim KörperbooleanPflichttrue meldet dich an, false ab.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Gruppen

Die offenen Gruppen und deine eigenen, ihre Beiträge, Mitglieder, Rollen und Einladungslinks.

GET/v2/communities

Die offenen Gruppen dieser Instanz; mit mine=true die Gruppen deines Kontos.

  • Recht read
  • mit ETag
  • seit v2.0

Nach Mitgliederzahl sortiert und nicht geblättert; next ist immer null.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
minein der Adressebooleanfreiwilligtrue für die Gruppen deines Kontos, auch interne und versteckte, nach Name.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Community, als `items` und `next`.

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

Mögliche Status: 200304401429

GET/v2/communities/{id}

Eine einzelne Gruppe, über ihre id.

  • Recht read
  • mit ETag
  • seit v2.0

Interne und versteckte Gruppen nur, wenn dein Konto Mitglied ist.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einem Community.

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

Mögliche Status: 200304400401404429

GET/v2/communities/{id}/posts

Die Beiträge des Feed-Kanals einer Gruppe, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Auf öffentlichen Pfaden sind counts.likes und counts.reposts immer 0 und pinned ist false.

Ist der Feed-Kanal aus, antwortet der Pfad mit 409 und feed_off.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Post, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/communities/{id}/members

Die Mitglieder einer Gruppe mit ihren Rollen.

  • Recht read
  • mit ETag
  • seit v2.15

Erst die Leitung, dann nach der höchsten Rolle; höchstens 300.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von GroupMember, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/communities/{id}/roles

Die Rollen einer Gruppe, die höchste zuerst, @everyone zuletzt.

  • Recht read
  • mit ETag
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Role, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/communities/{id}/bell

Welche Mitteilungen dir eine Gruppe schickt.

  • Recht read
  • mit ETag
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einem Bell.

Beispiel
{
  "level": "important"
}

Mögliche Status: 200304400401404429

GET/v2/invites/{code}

Die Gruppe hinter einem Einladungslink, vor dem Beitritt.

  • Recht read
  • mit ETag
  • seit v2.15

Parameter

NameTypBedeutung
codeim PfadstringPflichtDer Code eines Einladungslinks, das Ende seiner Adresse.

Beispielanfrage

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

Antwort

Antwortet mit einem InvitePreview.

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

Mögliche Status: 200304400401404429

PUT/v2/roles/{id}/self

Eine selbst wählbare Rolle nehmen oder ablegen.

  • Recht write
  • seit v2.20

Nur Rollen, die die Leitung als selbst wählbar anbietet (selfable), und nur für das eigene Konto.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Rolle.
activeim Körperbooleanfreiwilligfalse nimmt die Rolle; sonst wird sie gegeben.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/emojis

Die eigenen Emojis einer Gruppe.

  • Recht read
  • mit ETag
  • seit v2.20

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von GroupEmoji, als `items` und `next`.

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

Mögliche Status: 200304400401404429

PUT/v2/communities/{id}/bell

Einstellen, welche Mitteilungen dir eine Gruppe schickt.

  • Recht write
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
levelim KörperstringPflichtWelche Mitteilungen kommen.allimportantoff

Beispielanfrage

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"

Antwort

Antwortet mit einem Bell.

Beispiel
{
  "level": "important"
}

Mögliche Status: 200400401403404429

POST/v2/invites/{code}/join

Mit einem Einladungslink einer Gruppe beitreten.

  • Recht write
  • seit v2.15

Parameter

NameTypBedeutung
codeim PfadstringPflichtDer Code eines Einladungslinks, das Ende seiner Adresse.
rulesim Körperbooleanfreiwilligtrue, wenn du die Regeln der Gruppe annimmst; nötig, wenn sie welche hat.

Beispielanfrage

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

Antwort

Antwortet mit einem Joined.

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

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/bots

Die Bots einer Gruppe mit dem, was ihre Rolle erlaubt.

  • Recht read
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von GroupBot, als `items` und `next`.

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

Mögliche Status: 200304400401404429

Kanäle

Die Kanäle deiner Gruppen und ihr Chat: lesen, schreiben, als gelesen markieren.

GET/v2/communities/{id}/channels

Die Kanäle einer Gruppe, die du siehst, in ihrer Reihenfolge.

  • Recht read
  • mit ETag
  • seit v2.15

Der Feed-Kanal (kind: feed) steht nur hier, solange er an ist; seine Beiträge kommen über /communities/{id}/posts.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Channel, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/channels/{id}/messages

Die Nachrichten eines Chat-Kanals, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.15

Je Seite bis zu 50 Nachrichten. Nachrichten von Konten, die du blockiert hast oder die dich blockiert haben, fehlen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.
threadin der AdressestringfreiwilligDie Nachricht, deren Thread gelesen wird: sie selbst und ihre Antworten statt des Chats.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ChannelMessage, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/channels/{id}/messages

Eine Nachricht in einem Chat-Kanal schreiben.

  • Recht write
  • seit v2.15

@Name benachrichtigt ein Mitglied, @everyone mit dem Recht dazu alle, höchstens sechsmal pro Stunde.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.
textim KörperstringfreiwilligDer Text des Beitrags, der Antwort oder der Nachricht.
replyToim KörperstringfreiwilligDie id der Nachricht im selben Kanal, auf die du antwortest.
mediaim Körperstring[]freiwilligIDs von Bildern, die in der App hochgeladen wurden, oder eines GIFs oder Videos aus der Mediathek (seit 2.14).
threadim KörperstringfreiwilligDie Nachricht des Chats, in deren Thread geantwortet wird; ohne sie geht die Nachricht in den Chat.
cardim KörperobjectfreiwilligEine Karte { title, text, color, fields: [{ name, value }] }, höchstens 10 Felder.
buttonsim Körperobject[]freiwilligBis zu 5 Knöpfe, je { id, label, style } mit style primary, secondary oder danger. Ein Druck kommt als Ereignis interaction.

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

POST/v2/channels/{id}/read

Einen Chat-Kanal bis zu einem Zeitpunkt als gelesen markieren.

  • Recht write
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.
atim KörperintegerPflichtBis wann gelesen ist, in Millisekunden, meist das createdAt der neuesten Nachricht.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

DELETE/v2/channel-messages/{id}

Eine eigene Nachricht in einem Chat-Kanal löschen.

  • Recht write
  • seit v2.15

Nur eigene Nachrichten; Nachrichten anderer entfernt die Leitung mit dem Recht groups.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Nachricht in einem Chat-Kanal.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/voice

Wer gerade in den Sprachkanälen einer Gruppe ist, je Kanal.

  • Recht read
  • mit ETag
  • seit v2.19

Nur Kanäle, die du sehen darfst. Läuft kein Medienserver, ist die Liste leer.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von VoiceRoom, als `items` und `next`.

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

Mögliche Status: 200304400401404429

Gruppen verwalten

Was die Einstellungen einer Gruppe in der App können, mit dem Recht groups. Was dein Konto darf, entscheidet die Gruppe wie in der App: Leitung, Rollen und ihre Rangfolge.

POST/v2/communities/{id}/emojis

Der Gruppe ein Emoji geben.

  • Recht groups
  • seit v2.20

Nur wer die Kanäle der Gruppe verwalten darf. Das Bild wird wie ein eigenes Emoji hochgeladen (POST /me/emojis/pictures); der Name ist für alle Emojis nur einmal vergeben.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim KörperstringPflichtDer Name, unter dem du das Emoji mit :name: schreibst.
pictureim KörperstringPflichtDie id aus POST /me/emojis/pictures.

Beispielanfrage

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"

Antwort

Antwortet mit einer Seite von GroupEmoji, als `items` und `next`.

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

Mögliche Status: 200400401403404429

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

Ein Emoji der Gruppe entfernen.

  • Recht groups
  • seit v2.20

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim PfadstringPflichtDer Name des Emojis, ohne Doppelpunkte.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von GroupEmoji, als `items` und `next`.

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

Mögliche Status: 200400401403404429

POST/v2/communities/{id}/roles

Eine Rolle anlegen.

  • Recht groups
  • seit v2.15

Nur Rollen unter deiner eigenen höchsten und nur Rechte, die du selbst hast; die Leitung steht über allen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim KörperstringfreiwilligDer Name der Rolle; @everyone behält seinen.
colorim KörperstringfreiwilligDie Farbe; leer für keine.indigovioletroseambergreenteal
permissionsim Körperstring[]freiwilligDie Rechte: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableim Körperbooleanfreiwilligtrue: Mitglieder nehmen sich die Rolle selbst. Nur für Rollen, die nicht mehr als Mitmachen erlauben (view, send, attach, voice_connect, voice_speak, voice_video).

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

PUT/v2/roles/{id}

Name, Farbe und Rechte einer Rolle ändern.

  • Recht groups
  • seit v2.15

Ersetzt Name, Farbe und Rechte; was du weglässt, wird leer.

Nur Rollen unter deiner eigenen höchsten und nur Rechte, die du selbst hast; die Leitung steht über allen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Rolle.
nameim KörperstringfreiwilligDer Name der Rolle; @everyone behält seinen.
colorim KörperstringfreiwilligDie Farbe; leer für keine.indigovioletroseambergreenteal
permissionsim Körperstring[]freiwilligDie Rechte: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableim Körperbooleanfreiwilligtrue: Mitglieder nehmen sich die Rolle selbst. Nur für Rollen, die nicht mehr als Mitmachen erlauben (view, send, attach, voice_connect, voice_speak, voice_video).

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

DELETE/v2/roles/{id}

Eine Rolle löschen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Rolle.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Rangfolge der Rollen festlegen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
rolesim Körperstring[]PflichtDie ids aller Rollen unter deiner eigenen höchsten, die höchste zuerst; für die Leitung alle außer @everyone.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Einem Mitglied eine Rolle geben oder nehmen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Rolle.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.
activeim Körperbooleanfreiwilligfalse nimmt die Rolle; sonst wird sie gegeben.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/communities/{id}/channels

Einen Chat-Kanal anlegen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim KörperstringfreiwilligDer Name, ohne #; leer für den Namen, den die App in jeder Sprache gibt.
topicim KörperstringfreiwilligDas Thema, das über dem Kanal steht.
categoryim KörperstringfreiwilligDie id der Kategorie, in die der Kanal kommt; leer für keine.
emojiim KörperstringfreiwilligEin Emoji als Symbol.
iconim KörperstringfreiwilligEin Symbol aus dem Satz der App, mit seinem Namen.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageim KörperstringfreiwilligDie ID eines Bildes, das du mit /media/emoji hochgeladen hast.
colorim KörperstringfreiwilligDie Farbe der Kachel.brandindigovioletroseambergreentealred
shapeim KörperstringfreiwilligDie Form der Kachel; ohne ein Kreis.circlesquaretrianglediamondhexagonoctagonshieldstar

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

PUT/v2/channels/{id}

Name, Thema und Kategorie eines Kanals ändern.

  • Recht groups
  • seit v2.15

Ersetzt Name, Thema und Kategorie; was du weglässt, wird leer.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.
nameim KörperstringfreiwilligDer Name, ohne #; leer für den Namen, den die App in jeder Sprache gibt.
topicim KörperstringfreiwilligDas Thema, das über dem Kanal steht.
categoryim KörperstringfreiwilligDie id der Kategorie, in die der Kanal kommt; leer für keine.
emojiim KörperstringfreiwilligEin Emoji als Symbol.
iconim KörperstringfreiwilligEin Symbol aus dem Satz der App, mit seinem Namen.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageim KörperstringfreiwilligDie ID eines Bildes, das du mit /media/emoji hochgeladen hast.
colorim KörperstringfreiwilligDie Farbe der Kachel.brandindigovioletroseambergreentealred
shapeim KörperstringfreiwilligDie Form der Kachel; ohne ein Kreis.circlesquaretrianglediamondhexagonoctagonshieldstar

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

DELETE/v2/channels/{id}

Einen Chat-Kanal mit seinen Nachrichten löschen.

  • Recht groups
  • seit v2.15

Der Feed-Kanal lässt sich nicht löschen, nur ausschalten.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Reihenfolge der Kategorien und Chat-Kanäle festlegen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
categoriesim Körperstring[]PflichtDie ids aller Kategorien der Gruppe in der neuen Reihenfolge.
channelsim Körperstring[]PflichtDie ids aller Chat-Kanäle der Gruppe in der neuen Reihenfolge.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Form aller Kanal-Symbole der Gruppe festlegen.

  • Recht groups
  • seit v2.20

Nur die Leitung der Gruppe.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
shapeim KörperstringfreiwilligDie Form aller Symbole der Gruppe; weggelassen hat jeder Kanal seine eigene.circlesquaretrianglediamondhexagonoctagonshieldstar

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/channels/{id}/overrides

Was Rollen in einem Kanal anders dürfen als in der Gruppe.

  • Recht groups
  • mit ETag
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ChannelOverride, als `items` und `next`.

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

Mögliche Status: 200304400401403404429

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

Festlegen, was eine Rolle in einem Kanal anders darf.

  • Recht groups
  • seit v2.15

Nicht für Rollen auf oder über deiner eigenen höchsten.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.
roleim PfadstringPflichtDie id einer Rolle.
allowim Körperstring[]freiwilligWas die Rolle hier zusätzlich darf: im Chat view, send, attach, mention_everyone, moderate, im Feed-Kanal view und post_feed.
denyim Körperstring[]freiwilligWas die Rolle hier nicht darf, aus denselben Rechten. Beide Listen leer heben die Abweichung auf.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/communities/{id}/categories

Eine Kategorie für Kanäle anlegen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim KörperstringPflichtDer Name der Kategorie.
emojiim KörperstringfreiwilligEin Emoji als Symbol.
iconim KörperstringfreiwilligEin Symbol aus dem Satz der App, mit seinem Namen.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageim KörperstringfreiwilligDie ID eines Bildes, das du mit /media/emoji hochgeladen hast.
colorim KörperstringfreiwilligDie Farbe der Kachel.brandindigovioletroseambergreentealred

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

PUT/v2/categories/{id}

Eine Kategorie umbenennen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Kategorie.
nameim KörperstringPflichtDer Name der Kategorie.
emojiim KörperstringfreiwilligEin Emoji als Symbol.
iconim KörperstringfreiwilligEin Symbol aus dem Satz der App, mit seinem Namen.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageim KörperstringfreiwilligDie ID eines Bildes, das du mit /media/emoji hochgeladen hast.
colorim KörperstringfreiwilligDie Farbe der Kachel.brandindigovioletroseambergreentealred

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

DELETE/v2/categories/{id}

Eine Kategorie löschen.

  • Recht groups
  • seit v2.15

Ihre Kanäle bleiben, ohne Kategorie.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Kategorie.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

PUT/v2/communities/{id}/feed

Den Feed-Kanal einer Gruppe ein- oder ausschalten.

  • Recht groups
  • seit v2.15

Aus, bleiben die Beiträge gespeichert, sind aber nur für ihre Verfasser zu sehen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
onim KörperbooleanPflichttrue schaltet den Feed-Kanal ein, false aus.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/invites

Die Einladungslinks einer Gruppe, die noch gelten.

  • Recht groups
  • mit ETag
  • seit v2.15

Die Leitung sieht alle, alle anderen nur ihre eigenen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von InviteLink, als `items` und `next`.

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

Mögliche Status: 200304400401403404429

POST/v2/communities/{id}/invites

Einen Einladungslink erstellen.

  • Recht groups
  • seit v2.15

Ein Link gilt nur, solange du einladen darfst, und geht mit deinem Austritt.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
daysim KörperintegerfreiwilligWie viele Tage der Link gilt; ohne gilt er, bis er zurückgenommen wird.1730
usesim KörperintegerfreiwilligWie oft der Link genutzt werden kann; ohne beliebig oft.151025100

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

DELETE/v2/invites/{code}

Einen Einladungslink zurücknehmen.

  • Recht groups
  • seit v2.15

Parameter

NameTypBedeutung
codeim PfadstringPflichtDer Code eines Einladungslinks, das Ende seiner Adresse.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Nachricht eines anderen Mitglieds aus einem Kanal entfernen.

  • Recht groups
  • seit v2.15

Mit Eintrag im Protokoll der Gruppe und höchstens 60 pro Stunde, wie in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Nachricht in einem Chat-Kanal.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Einen Beitrag aus einer Gruppe entfernen.

  • Recht groups
  • seit v2.15

Mit Eintrag im Protokoll der Gruppe und höchstens 60 pro Stunde, wie in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
postim PfadstringPflichtDie id eines Beitrags.
reasonim KörperstringPflichtDie Begründung, die das Mitglied liest.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Ein Mitglied aus einer Gruppe kicken.

  • Recht groups
  • seit v2.15

Seit 2.16 ein Kick: Das Mitglied kann wieder beitreten. Wer draußen bleiben soll, wird gebannt.

Nur mit dem Recht dafür und nur bei Mitgliedern unter deiner eigenen höchsten Rolle; die Co-Leitung nur als Gründer.

Mit Eintrag im Protokoll der Gruppe und höchstens 60 pro Stunde, wie in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.
reasonim KörperstringPflichtDie Begründung, die das Mitglied liest.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Ein Mitglied stummschalten.

  • Recht groups
  • seit v2.16

Ein neuer Timeout ersetzt einen laufenden. Austreten und neu beitreten beendet ihn nicht.

Nur mit dem Recht dafür und nur bei Mitgliedern unter deiner eigenen höchsten Rolle; die Co-Leitung nur als Gründer.

Mit Eintrag im Protokoll der Gruppe und höchstens 60 pro Stunde, wie in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.
secondsim KörperintegerPflichtWie lange, in Sekunden.60300600360086400604800
reasonim KörperstringfreiwilligEine Begründung, die das Mitglied liest; freiwillig.

Beispielanfrage

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"

Antwort

Antwortet mit einem Until.

Beispiel
{
  "until": 1758624600000
}

Mögliche Status: 200400401403404429

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

Einen Timeout aufheben.

  • Recht groups
  • seit v2.16

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.

Beispielanfrage

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"

Antwort

Antwortet mit einem Until.

Beispiel
{
  "until": 1758624600000
}

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/bans

Die laufenden Banns einer Gruppe.

  • Recht groups
  • mit ETag
  • seit v2.16

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Ban, als `items` und `next`.

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

Mögliche Status: 200304400401403404429

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

Ein Mitglied bannen.

  • Recht groups
  • seit v2.16

Ohne days gilt der Bann, bis er aufgehoben wird.

Nur mit dem Recht dafür und nur bei Mitgliedern unter deiner eigenen höchsten Rolle; die Co-Leitung nur als Gründer.

Mit Eintrag im Protokoll der Gruppe und höchstens 60 pro Stunde, wie in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.
daysim KörperintegerfreiwilligWie lange, in Tagen; weglassen für einen Bann ohne Ende.1730
reasonim KörperstringPflichtDie Begründung, die das Mitglied liest.

Beispielanfrage

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"

Antwort

Antwortet mit einem Until.

Beispiel
{
  "until": 1758624600000
}

Mögliche Status: 200400401403404429

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

Einen Bann aufheben.

  • Recht groups
  • seit v2.16

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
memberim PfadstringPflichtDie id des Kontos eines Mitglieds.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

GET/v2/communities/{id}/log

Das Protokoll der Leitung: wer was entfernt hat und warum.

  • Recht groups
  • mit ETag
  • seit v2.15

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von LogEntry, als `items` und `next`.

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

Mögliche Status: 200304400401403404429

POST/v2/communities

Eine Gruppe gründen. Antwortet mit ihrer id; du bist ihr Gründer.

  • Recht groups
  • seit v2.19

Braucht die Berechtigung groups. Ohne Angabe ist die Gruppe internal und frei beitretbar; eine versteckte nur mit Einladung. Ob Mitglieder Gruppen gründen dürfen, legt der Betreiber fest.

Parameter

NameTypBedeutung
nameim KörperstringPflichtDer Name, höchstens 60 Zeichen.
descriptionim KörperstringfreiwilligDie Beschreibung, höchstens 240 Zeichen.
handleim KörperstringfreiwilligDas Kürzel für @#Erwähnungen und den Link: 3 bis 30 Kleinbuchstaben, Ziffern oder _.
tagsim Körperstring[]freiwilligBis zu 5 #Tags, worum es in der Gruppe geht.
joinPolicyim KörperstringfreiwilligWie man beitritt: open frei, application mit Bewerbung, invite nur mit Einladung.openapplicationinvite
visibilityim KörperstringfreiwilligWer die Gruppe sieht: open alle, internal nur Mitglieder ihren Inhalt, hidden nur Mitglieder überhaupt.openinternalhidden

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403429

PUT/v2/communities/{id}

Eine Gruppe ändern, die du leitest. Was du nicht angibst, bleibt.

  • Recht groups
  • seit v2.19

Braucht die Berechtigung groups und die Leitung der Gruppe. Leitung, Auflösen und Funken-Vorteile bleiben in der App.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Gruppe.
nameim KörperstringfreiwilligDer Name, höchstens 60 Zeichen.
descriptionim KörperstringfreiwilligDie Beschreibung, höchstens 240 Zeichen.
handleim KörperstringfreiwilligDas Kürzel für @#Erwähnungen und den Link: 3 bis 30 Kleinbuchstaben, Ziffern oder _.
tagsim Körperstring[]freiwilligBis zu 5 #Tags, worum es in der Gruppe geht.
joinPolicyim KörperstringfreiwilligWie man beitritt: open frei, application mit Bewerbung, invite nur mit Einladung.openapplicationinvite
visibilityim KörperstringfreiwilligWer die Gruppe sieht: open alle, internal nur Mitglieder ihren Inhalt, hidden nur Mitglieder überhaupt.openinternalhidden
imageim KörperstringfreiwilligDie id eines hochgeladenen Bildes (POST /me/pictures) als Gruppenbild. Leer entfernt es.
bannerim KörperstringfreiwilligDie id eines hochgeladenen Bildes als Titelbild der Gruppe. Leer entfernt es.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Bots

Was in den Gruppen eines Bots geschieht, in Echtzeit: als Strom, Seite für Seite oder an eine Adresse geliefert.

GET/v2/events

Die Ereignisse aus den Gruppen des Bots seit einem Ereignis, Seite für Seite.

  • Recht read
  • seit v2.20

Nur mit dem Token eines Bots. Ereignisse eines Kanals nur, wenn der Bot ihn sehen darf.

Ereignisse bleiben einen Tag. next ist die Nummer des letzten, für die nächste Seite als since.

Parameter

NameTypBedeutung
sincein der AdressestringfreiwilligDie Nummer des letzten Ereignisses, das der Bot schon hat. Ohne sie beginnt der Strom jetzt und die Liste beim ältesten.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von BotEvent, als `items` und `next`.

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

Mögliche Status: 200401429

GET/v2/events/stream

Die Ereignisse aus den Gruppen des Bots, sobald sie geschehen (Server-Sent Events).

  • Recht read
  • mit ETag
  • seit v2.20

Die Verbindung bleibt offen und schließt nach zehn Minuten; der Client verbindet sich neu und schickt Last-Event-ID mit.

Nur mit dem Token eines Bots. Ereignisse eines Kanals nur, wenn der Bot ihn sehen darf.

Parameter

NameTypBedeutung
sincein der AdressestringfreiwilligDie Nummer des letzten Ereignisses, das der Bot schon hat. Ohne sie beginnt der Strom jetzt und die Liste beim ältesten.

Beispielanfrage

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

Antwort

Antwortet mit einem BotEvent.

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

Mögliche Status: 200304401429

GET/v2/me/commands

Die Befehle des Bots.

  • Recht read
  • mit ETag
  • seit v2.20

Nur mit dem Token eines Bots. Ereignisse eines Kanals nur, wenn der Bot ihn sehen darf.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von BotCommand, als `items` und `next`.

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

Mögliche Status: 200304401429

PUT/v2/me/commands

Die Befehle des Bots festlegen, alle auf einmal.

  • Recht write
  • seit v2.20

Ersetzt alle Befehle; eine leere Liste nimmt sie weg. In Chats, die der Bot sehen darf, bietet das Eingabefeld sie nach „/“ an.

Parameter

NameTypBedeutung
commandsim Körperobject[]PflichtBis zu 25 Befehle, je { name, description }.

Beispielanfrage

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"

Antwort

Antwortet mit einer Seite von BotCommand, als `items` und `next`.

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

Mögliche Status: 200400401403429

POST/v2/interactions/{id}/reply

Auf einen Befehl oder Knopf antworten.

  • Recht write
  • seit v2.20

Innerhalb von 15 Minuten nach dem Ereignis command oder interaction; mit private sieht die Antwort nur, wer den Befehl oder Knopf benutzt hat.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie Kennung aus dem Ereignis (data.interaction).
textim KörperstringfreiwilligDer Text des Beitrags, der Antwort oder der Nachricht.
privateim Körperbooleanfreiwilligtrue: nur wer den Befehl oder Knopf benutzt hat, sieht die Antwort, einen Tag lang.
cardim KörperobjectfreiwilligEine Karte { title, text, color, fields: [{ name, value }] }, höchstens 10 Felder.
buttonsim Körperobject[]freiwilligBis zu 5 Knöpfe, je { id, label, style } mit style primary, secondary oder danger. Ein Druck kommt als Ereignis interaction.

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

POST/v2/channels/{id}/voice

Einen Platz im Sprachkanal nehmen, um Musik oder Ton abzuspielen.

  • Recht write
  • seit v2.20

Nur mit dem Token eines Bots, wie es die Rolle des Bots im Kanal erlaubt. Das Programm verbindet sich mit einem LiveKit-SDK und sendet seinen Ton als Mikrofon; alle anderen regeln seine Lautstärke selbst.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Kanals.

Beispielanfrage

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

Antwort

Antwortet mit einem VoiceSeat.

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

Mögliche Status: 200400401403404429

Entdecken

Trends, Suche und die eigenen Emojis der Instanz.

GET/v2/tags

Die Tags, die gerade laufen.

  • Recht read
  • mit ETag
  • seit v2.0

Höchstens 10 laufende Tags nach Punkten: Jede Nutzung zählt 1 und halbiert sich alle 3 Tage, ein Konto zählt je Tag höchstens 3. posts ist der gerundete Punktestand. limit kürzt nur die Liste. Vom Team hervorgehobene Tags können weiter vorn stehen.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Tag, als `items` und `next`.

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

Mögliche Status: 200304401429

GET/v2/search

Eine Suche über Beiträge, Namen, Kürzel und Tags.

  • Recht read
  • mit ETag
  • seit v2.0

Sucht nur Öffentliches: Beiträge außerhalb von Gruppen, Profile und Tags. limit gilt je Art.

Parameter

NameTypBedeutung
qin der AdressestringPflichtDie Wörter, nach denen gesucht wird.
typein der AdressestringfreiwilligWelche Art von Treffer. Ohne ihn jede Art.allpostsprofilestags
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.

Beispielanfrage

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

Antwort

Antwortet mit einem SearchResult.

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

Mögliche Status: 200304400401429

GET/v2/emojis

Die eigenen Emojis der Instanz, mit der Adresse ihrer Bilder.

  • Recht read
  • mit ETag
  • seit v2.1

In Texten steht ein Emoji als :name:. Ersetz es durch das Bild aus dieser Liste; unbekannte Namen bleiben Text.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Emoji, als `items` und `next`.

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

Mögliche Status: 200304401429

GIFs und Videos

Die Mediathek: geteilte GIFs und Videos finden, die eigenen hochladen und verwalten und auf anderen Websites einbinden.

GET/v2/media

Geteilte GIFs oder Videos, die meistgenutzten zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.14

Ohne Konten, die du blockiert hast oder die dich blockiert haben. url und poster lädst du mit dem Schlüssel im Header, für die Beiträge auf tellmelo.

Für andere Websites nur, was embed hat: Dessen Adressen funktionieren ohne Schlüssel, in jedem Browser.

Parameter

NameTypBedeutung
kindin der Adressestringfreiwilliggif oder video; ohne Angabe gif.gifvideo
qin der AdressestringfreiwilligWörter, die im Namen oder in den Stichwörtern vorkommen.
anywherein der Adressebooleanfreiwilligtrue: nur, was auch auf anderen Websites erscheinen darf.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von MediaItem, als `items` und `next`.

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

Mögliche Status: 200304400401429

GET/v2/media/mine

Deine eigene Mediathek, das Neueste zuerst.

  • Recht media
  • blätterbar
  • mit ETag
  • seit v2.14

Parameter

NameTypBedeutung
kindin der Adressestringfreiwilliggif oder video; ohne Angabe gif.gifvideo
qin der AdressestringfreiwilligWörter, die im Namen oder in den Stichwörtern vorkommen.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von MediaItem, als `items` und `next`.

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

Mögliche Status: 200304400401403429

GET/v2/media/{id}

Ein GIF oder Video, deines oder ein geteiltes.

  • Recht read
  • mit ETag
  • seit v2.14

Parameter

NameTypBedeutung
idim PfadstringPflichtDie ID des GIFs oder Videos.

Beispielanfrage

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

Antwort

Antwortet mit einem MediaItem.

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

Mögliche Status: 200304400401404429

POST/v2/media/uploads

Ein Hochladen beginnen.

  • Recht media
  • seit v2.14

Danach die Datei in Stücken von höchstens piece Bytes an /media/uploads/{upload} senden. Ohne neues Stück endet ein Hochladen nach 15 Minuten.

Es gelten die Grenzen der App: GIFs bis 15 MB, Videos nach Abo in Größe und Länge, GIFs je Tag, private GIFs, Videopunkte je Woche. Sonst kommt 409, 413 oder 429.

Parameter

NameTypBedeutung
kindim KörperstringPflichtgif oder video; ohne Angabe gif.gifvideo
sizeim KörperintegerPflichtDie Größe der ganzen Datei in Bytes.
nameim KörperstringPflichtDer Name, unter dem man es findet: 2 bis 40 Zeichen.
keywordsim KörperstringfreiwilligStichwörter für die Suche, durch Leerzeichen getrennt.
sharedim Körperbooleanfreiwilligtrue: für alle auf tellmelo geteilt.
anywhereim Körperbooleanfreiwilligtrue: geteilt und auch auf anderen Websites erlaubt. Nur zusammen mit shared.

Beispielanfrage

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"

Antwort

Antwortet mit einem UploadStarted.

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

Mögliche Status: 200400401403429

PUT/v2/media/uploads/{upload}

Ein Stück der Datei senden.

  • Recht media
  • seit v2.14

Der Körper ist das Stück selbst (application/octet-stream), kein JSON. Schließt es nicht an, kommt 409 mit received: Von dort weitersenden. Nach dem letzten Stück wird umgewandelt; die Antwort hat dann item.

Parameter

NameTypBedeutung
uploadim PfadstringPflichtDas upload aus dem Beginn.
offsetin der AdresseintegerPflichtWo das Stück in der Datei beginnt, in Bytes; für das erste 0.

Beispielanfrage

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"

Antwort

Antwortet mit einem UploadPiece.

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

Mögliche Status: 200400401403404429

POST/v2/media/{id}

Eines deiner GIFs oder Videos ändern.

  • Recht media
  • seit v2.14

Parameter

NameTypBedeutung
idim PfadstringPflichtDie ID des GIFs oder Videos.
nameim KörperstringfreiwilligDer Name, unter dem man es findet: 2 bis 40 Zeichen.
keywordsim KörperstringfreiwilligStichwörter für die Suche, durch Leerzeichen getrennt.
sharedim Körperbooleanfreiwilligtrue: für alle auf tellmelo geteilt.
anywhereim Körperbooleanfreiwilligtrue: geteilt und auch auf anderen Websites erlaubt. Nur zusammen mit shared.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

DELETE/v2/media/{id}

Eines deiner GIFs oder Videos entfernen.

  • Recht media
  • seit v2.14

Beiträge, die es schon zeigen, behalten es. Auf anderen Websites verschwindet es innerhalb von Minuten.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie ID des GIFs oder Videos.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Dein Konto

Dein Profil, dein Feed, deine eigenen Emojis und deine Webhooks.

GET/v2/me

Dein eigenes Profil, mit der id, die die anderen Wege erwarten.

  • Recht read
  • mit ETag
  • seit v2.0

Beispielanfrage

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

Antwort

Antwortet mit einem Profile.

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

Mögliche Status: 200304401429

GET/v2/feed

Dein eigener Feed, so wie die Anwendung ihn zusammenstellt.

  • Recht read
  • blätterbar
  • seit v2.0

Kein ETag, weil sich die Reihenfolge ständig ändert. Eine begonnene Liste bleibt bis zum Ende gleich.

Parameter

NameTypBedeutung
tabin der AdressestringfreiwilligWelcher Feed: for-you, following, latest oder bookmarks. latest als Vorgabe.for-youfollowinglatestbookmarks
tagin der AdressestringfreiwilligNur Beiträge zu diesem Tag: mit ihm geschrieben oder vom Server darin erkannt. Ohne ihn kein Filter.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Post, als `items` und `next`.

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

Mögliche Status: 200400401429

POST/v2/me/pictures

Ein Bild hochladen, als seine Bytes. Antwortet mit id und url; die id nimmst du dann als Profilbild, Titelbild oder für einen Beitrag.

  • Recht write
  • seit v2.19

PNG, JPEG, WebP oder GIF, erkannt an den ersten Bytes; ohne Metadaten neu gespeichert. Ein Bild, das in nichts verwendet wird, wird später gelöscht.

Beispielanfrage

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"

Antwort

Antwortet mit einem Picture.

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

Mögliche Status: 200401403429

PUT/v2/me/profile

Dein Profil ändern: Name, Über dich, Profilbild, Titelbild und Profilfarbe. Was du nicht angibst, bleibt.

  • Recht profile
  • seit v2.19

Braucht die Berechtigung profile. Dein @Name bleibt in der App: Er ist auch dein Anmeldename.

Parameter

NameTypBedeutung
nameim KörperstringfreiwilligDer Anzeigename, höchstens 60 Zeichen.
aboutim KörperstringfreiwilligDer Text „Über dich“.
avatarim KörperstringfreiwilligDie id eines hochgeladenen Bildes als Profilbild. Leer entfernt es.
bannerim KörperstringfreiwilligDie id eines hochgeladenen Bildes als Titelbild. Leer entfernt es.
colorim KörperstringfreiwilligDie Profilfarbe, mit einem Abo. null entfernt sie.indigovioletrosecoralamberlimegreentealskyslatesandnight

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403429

GET/v2/me/emojis

Deine eigenen Emojis.

  • Recht read
  • mit ETag
  • seit v2.19

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von OwnEmoji, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/me/emojis/pictures

Das Bild für ein eigenes Emoji hochladen, als seine Bytes.

  • Recht profile
  • seit v2.19

Bewegte Emojis brauchen ein Abo. Zu groß nach dem Umrechnen, wird das Bild abgelehnt.

Beispielanfrage

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"

Antwort

Antwortet mit einem EmojiPicture.

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

Mögliche Status: 200401403429

POST/v2/me/emojis

Ein eigenes Emoji anlegen. Antwortet mit allen deinen Emojis.

  • Recht profile
  • seit v2.19

Wie viele Emojis du anlegen kannst, hängt vom Abo ab.

Parameter

NameTypBedeutung
nameim KörperstringPflichtDer Name, unter dem du das Emoji mit :name: schreibst.
pictureim KörperstringPflichtDie id aus POST /me/emojis/pictures.

Beispielanfrage

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"

Antwort

Antwortet mit einer Seite von OwnEmoji, als `items` und `next`.

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

Mögliche Status: 200400401403429

DELETE/v2/me/emojis/{name}

Ein eigenes Emoji entfernen. Antwortet mit den übrigen.

  • Recht profile
  • seit v2.19

Parameter

NameTypBedeutung
nameim PfadstringPflichtDer Name des Emojis, ohne Doppelpunkte.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von OwnEmoji, als `items` und `next`.

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

Mögliche Status: 200400401403404429

PUT/v2/me/emojis/sharing

Festlegen, ob deine Follower deine Emojis in eigenen Texten nutzen dürfen.

  • Recht profile
  • seit v2.19

Parameter

NameTypBedeutung
sharedim KörperbooleanPflichttrue teilt deine Emojis mit deinen Followern, false nicht.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403429

GET/v2/me/webhooks

Deine Webhooks mit ihrem Stand.

  • Recht webhooks
  • mit ETag
  • seit v2.19

Braucht die Berechtigung webhooks. Webhooks gibt es mit einem Organisations-Abo oder als Partner.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Webhook, als `items` und `next`.

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

Mögliche Status: 200304401403429

POST/v2/me/webhooks

Einen Webhook anlegen. Antwortet mit id und dem Geheimnis für die Signaturen, nur dieses eine Mal.

  • Recht webhooks
  • seit v2.19

Jede Zustellung ist mit dem Geheimnis signiert (X-Tellmelo-Signature). Bewahre es auf; es wird nicht noch einmal gezeigt.

Parameter

NameTypBedeutung
urlim KörperstringPflichtEine HTTPS-Adresse außerhalb lokaler Netze, ohne Zugangsdaten.
kindsim Körperstring[]PflichtWorüber der Webhook Bescheid bekommt. Welche Arten dir offenstehen, hängt von Abo und Partnerschaft ab.replymentiongroup_mentionfollowlikerepostmessagequota_changedquota_giftdrop_claimeddrop_empty

Beispielanfrage

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"

Antwort

Antwortet mit einem WebhookCreated.

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

Mögliche Status: 200400401403429

DELETE/v2/me/webhooks/{id}

Einen Webhook löschen.

  • Recht webhooks
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Webhooks.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Eine Probe an einen Webhook senden.

  • Recht webhooks
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id des Webhooks.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Mitteilungen

Was rund um dein Konto passiert ist, seitenweise.

GET/v2/notifications

Deine Mitteilungen, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Lesen markiert nichts als gelesen, das tut POST /notifications/read. Gleiche Ereignisse zum selben Beitrag stehen in einer Zeile, more sagt, wie viele.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Notification, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/notifications/read

Deine Mitteilungen als gelesen markieren.

  • Recht write
  • seit v2.0

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200401403429

Nachrichten

Dein Postfach und deine Gespräche. Ein Gespräch heißt nach dem anderen Konto.

GET/v2/conversations

Dein Postfach: eine Zeile je Gespräch, das jüngste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Conversation, als `items` und `next`.

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

Mögliche Status: 200304401429

GET/v2/conversations/{with}/messages

Die Nachrichten eines Gesprächs, neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.0

Lesen markiert nichts als gelesen, das tut POST /conversations/{with}/read.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des anderen Kontos. Ein Gespräch hat keine eigene id.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Message, als `items` und `next`.

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

Mögliche Status: 200304400401404429

POST/v2/conversations/{with}/messages

Eine Nachricht in einem Gespräch senden.

  • Recht write
  • seit v2.0

Es gelten die Regeln der App: Wer dich blockiert hat, ist nicht erreichbar, und die Einstellungen der anderen Person zählen.

Bilder, GIFs und Videos lassen sich an Nachrichten über die API nicht anhängen, nur in der App.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des anderen Kontos. Ein Gespräch hat keine eigene id.
textim KörperstringPflichtDer Text des Beitrags, der Antwort oder der Nachricht.
replyToim KörperstringfreiwilligDie id einer früheren Nachricht dieses Gesprächs, auf die diese antwortet. Seit 2.2.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/conversations/{with}/read

Alle Nachrichten eines Gesprächs als gelesen markieren.

  • Recht write
  • seit v2.1

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des anderen Kontos. Ein Gespräch hat keine eigene id.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Eine eigene Nachricht löschen.

  • Recht write
  • seit v2.12

Nur eigene Nachrichten, und nur in den ersten 24 Stunden nach dem Senden.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des anderen Kontos. Ein Gespräch hat keine eigene id.
idim PfadstringPflichtDie id der Nachricht.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

POST/v2/conversations/{with}/planned

Eine Nachricht für später planen. Antwortet mit der id der geplanten Nachricht.

  • Recht write
  • seit v2.19

Braucht ein Abo, das geplante Nachrichten enthält, sonst 403. Mit Ende-zu-Ende-Verschlüsselung auf beiden Seiten geht es nur in der App.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des anderen Kontos. Ein Gespräch hat keine eigene id.
textim KörperstringPflichtDer Text des Beitrags, der Antwort oder der Nachricht.
sendAtim KörperintegerPflichtWann die Nachricht gesendet wird, in Millisekunden seit 1970.

Beispielanfrage

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"

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403404429

GET/v2/me/planned-messages

Die eigenen Nachrichten, die noch gesendet werden, nach Zeit geordnet.

  • Recht read
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
within der AdressestringfreiwilligNur die Nachrichten an dieses Konto (seine id).

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von PlannedMessage, als `items` und `next`.

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

Mögliche Status: 200304401429

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

Eine zurückgehaltene oder fehlgeschlagene geplante Nachricht jetzt senden.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der geplanten Nachricht.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Eine geplante Nachricht löschen, bevor sie gesendet wird.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der geplanten Nachricht.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Beziehungen

Gefällt mir, merken, teilen, folgen, beitreten, blockieren: ein Pfad, gesetzt und zurückgenommen mit active. Seit 2.19 auch die Listen: Follower, Gefolgte und eigene Blockierungen und Stummschaltungen.

POST/v2/relations

Mögen, merken, teilen, folgen, beitreten, blockieren, stummschalten, je nach kind.

  • Recht write
  • seit v2.0

target ist bei like, save und repost ein Beitrag, bei join eine Gruppe, bei follow, block und mute ein Konto. active: false nimmt die Beziehung zurück.

Parameter

NameTypBedeutung
kindim KörperstringPflichtWelche Beziehung: like, save, repost, follow, join, block oder mute (seit 2.2).likesaverepostfollowjoinblockmute
targetim KörperstringPflichtDie id des Beitrags, Profils oder der Gruppe, je nach kind.
activeim Körperbooleanfreiwilligtrue setzt die Beziehung, false nimmt sie zurück.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403429

GET/v2/profiles/{handle}/followers

Wer einem Profil folgt, die neuesten zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils, in beliebiger Groß- und Kleinschreibung.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ProfileBrief, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/profiles/{handle}/following

Wem ein Profil folgt, die neuesten zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.19

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils, in beliebiger Groß- und Kleinschreibung.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ProfileBrief, als `items` und `next`.

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

Mögliche Status: 200304400401404429

GET/v2/me/relations

Wen du blockiert, stummgeschaltet oder nur für Nachrichten blockiert hast, die neuesten zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.19

Nur deine eigenen Listen. Setzen und Zurücknehmen geht über POST /relations.

Parameter

NameTypBedeutung
kindin der AdressestringPflichtblock blockiert, mute stummgeschaltet, dm_block nur für Nachrichten blockiert.blockmutedm_block
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von ProfileBrief, als `items` und `next`.

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

Mögliche Status: 200304400401429

Sammlungen

Gemerkte Beiträge in eigenen Sammlungen ordnen. Ein Beitrag kann in mehreren sein; aus einer Sammlung genommen bleibt er gemerkt.

GET/v2/me/collections

Deine Sammlungen mit der Zahl ihrer Beiträge.

  • Recht read
  • mit ETag
  • seit v2.19

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Collection, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/me/collections

Eine Sammlung anlegen. Antwortet mit ihrer id.

  • Recht write
  • seit v2.19

Wie viele Sammlungen du anlegen kannst, hängt vom Abo ab.

Parameter

NameTypBedeutung
nameim KörperstringPflichtDer Name, höchstens 40 Zeichen. Je Konto einmalig, ohne Rücksicht auf Groß- und Kleinschreibung.

Beispielanfrage

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

Antwort

Antwortet mit einem Made.

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

Mögliche Status: 200400401403429

PUT/v2/me/collections/{id}

Eine Sammlung umbenennen.

  • Recht write
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Sammlung.
nameim KörperstringPflichtDer Name, höchstens 40 Zeichen. Je Konto einmalig, ohne Rücksicht auf Groß- und Kleinschreibung.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

DELETE/v2/me/collections/{id}

Eine Sammlung löschen.

  • Recht write
  • seit v2.19

Die Beiträge darin bleiben gemerkt.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Sammlung.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Die Beiträge einer Sammlung, wie im Reiter „Gemerkt“.

  • Recht read
  • blätterbar
  • seit v2.19

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Sammlung.
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von Post, als `items` und `next`.

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

Mögliche Status: 200400401404429

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

Einen Beitrag in eine Sammlung legen oder herausnehmen.

  • Recht write
  • seit v2.19

Hineinlegen merkt den Beitrag auch. Nur sichtbare Beiträge.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id der Sammlung.
postim KörperstringPflichtDie id des Beitrags.
insideim Körperbooleanfreiwilligtrue legt den Beitrag hinein (Standard), false nimmt ihn heraus.

Beispielanfrage

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"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Geschenke

Das Kontingent eines Partners lesen und daraus verschenken, Geschenke unter Beiträgen verteilen und im Blick behalten. Abholen bleibt Menschen in der App vorbehalten.

GET/v2/partner/quota

Wie viel noch in deinem Kontingent zum Verschenken steckt.

  • Recht read
  • mit ETag
  • seit v2.12

Nur für Partner mit Kontingent; alle anderen bekommen 403.

Beispielanfrage

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

Antwort

Antwortet mit einem Quota.

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

Mögliche Status: 200304401429

GET/v2/partner/gifts

Was du aus dem Kontingent verschenkt hast, an wen und wann – das Neueste zuerst.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.12

Nur für Partner mit Kontingent; alle anderen bekommen 403.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von QuotaGift, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/partner/gifts

Abo-Monate oder Funken aus deinem Kontingent an ein Mitglied verschenken.

  • Recht gifts
  • seit v2.12

Nur für Partner mit Kontingent; alle anderen bekommen 403.

Das Mitglied erfährt wie in der App, von wem das Geschenk kommt. Höchstens 60 Geschenke je Stunde.

Parameter

NameTypBedeutung
handleim KörperstringPflichtDer @Name des Mitglieds, das du beschenkst, mit oder ohne @.
itemim KörperstringPflichtplan für Abo-Monate, sparks für Funken, shop für einen Look aus deinem Vorrat (seit 2.13).plansparksshop
quantityim KörperintegerfreiwilligWie viel: bis zu 12 Monate oder 35 Funken je Geschenk.
itemIdim KörperstringfreiwilligFür shop: die ID des Looks, wie looks im Kontingent sie nennt. Ein Stück je Geschenk; quantity gilt dann nicht.

Beispielanfrage

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"

Antwort

Antwortet mit einem Quota.

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

Mögliche Status: 200400401403429

GET/v2/gift-drops

Deine Geschenke unter Beiträgen: wie viele Plätze noch frei sind und wie sie bezahlt wurden.

  • Recht read
  • blätterbar
  • mit ETag
  • seit v2.12

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligEinträge je Seite: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligDas next der vorigen Antwort. Ohne ihn von vorn.

Beispielanfrage

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

Antwort

Antwortet mit einer Seite von OwnGiftDrop, als `items` und `next`.

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

Mögliche Status: 200304401429

POST/v2/gift-drops

Einen Beitrag mit Geschenken zum Abholen veröffentlichen.

  • Recht gifts
  • seit v2.12

Kostenlos für den Inhaber und Teammitglieder mit dem Recht dazu, sonst aus deinem Kontingent. Was bezahlt werden müsste, lehnt die API mit 422 ab – bezahlen geht nur in der App.

Abholen geht nur in der App, damit kein Programm alle Plätze abräumt. Wie viele noch frei sind, steht am Beitrag in giftDrop.

Parameter

NameTypBedeutung
textim KörperstringfreiwilligDer Text des Beitrags, der Antwort oder der Nachricht.
communityim KörperstringfreiwilligDie id der Gruppe, in deren Feed-Kanal der Beitrag geht; er muss an sein, und du brauchst das Recht dazu. Ohne sie steht der Beitrag außerhalb jeder Gruppe.
itemim KörperstringPflichtplan für Abo-Monate, sparks für Funken.plansparks
quantityim KörperintegerPflichtWas jeder Platz enthält: bis zu 12 Monate oder 35 Funken.
placesim KörperintegerPflichtFür wie viele Personen, bis zu 10 000.
audienceim KörperstringfreiwilligWer abholen darf: all alle, followers nur deine Follower, group nur die Mitglieder der Gruppe (nur zusammen mit community).allfollowersgroup
newAccountsim Körperbooleanfreiwilligtrue lässt auch Konten abholen, die jünger als 7 Tage sind. Ohne Angabe bleiben sie außen vor.

Beispielanfrage

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"

Antwort

Antwortet mit einem DropCreated.

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

Mögliche Status: 200400401403429

Objekte

Alle Objekte, Feld für Feld. [] heißt Liste.

Service

Die Antwort der Wurzel: wer antwortet, und was dieser Schlüssel darf.

FeldTypBedeutung
namestringImmer tellmelo.
versionstringDie Version der API, zum Beispiel 2.1.
scopestringWas dieser Schlüssel darf: read oder read write.
rateLimitRateLimitDas Kontingent dieses Schlüssels.
docsstringWo diese Dokumentation steht, als Pfad auf dieser Instanz.
specstringWo die maschinenlesbare Beschreibung steht.
Beispiel
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

RateLimit

Das Kontingent dieses Schlüssels in der laufenden Minute.

FeldTypBedeutung
limitintegerAnfragen je Minute.
remainingintegerWie viele in dieser Minute übrig sind.
Beispiel
{
  "limit": 120,
  "remaining": 117
}

Post

Ein Beitrag, überall in derselben Form.

FeldTypBedeutung
idstringDie ID des Beitrags.
textstringoder nullDer Text, wie geschrieben (null bei einem Beitrag, der nur Umfrage oder nur Bilder ist).
kindstringWas der Beitrag ist.
  • post — Ein Beitrag mit Text, Bildern oder einem Zitat.
  • poll — Ein Beitrag mit einer Umfrage.
authorProfileBriefWer ihn geschrieben hat.
communityCommunityBriefoder nullDie Gruppe, in der er geschrieben wurde (null außerhalb jeder Gruppe).
mediaMedia[]Seine Bilder, in Reihenfolge; leer, wenn es keine gibt.
pollPolloder nullDie Umfrage (null, wenn es keine gibt).
quotesstringoder nullDie ID des Beitrags, den dieser zitiert.
continuesstringoder nullDie ID des Beitrags, den dieser als Nachtrag fortsetzt.
countsCountsAntworten, Gefällt-mir und Reposts.
pinnedbooleanOb er oben im Profil seines Verfassers angeheftet ist.
giftDropGiftDropoder nullGeschenke zum Abholen unter dem Beitrag (null, wenn es keine gibt).
createdAtintegerWann er geschrieben wurde.
Beispiel
{
  "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

Eine Antwort unter einem Beitrag: ein Beitrag mit zwei Feldern mehr.

Jedes Feld von Post, und dazu:

FeldTypBedeutung
postIdstringDer Beitrag, an dem das ganze Gespräch hängt.
parentIdstringoder nullDie Antwort, auf die diese antwortet (null, wenn sie direkt auf den Beitrag antwortet).
Beispiel
{
  "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

Deine Stimme zu einer Antwort und ihre Wertung.

FeldTypBedeutung
votestringDeine Stimme.
  • up — Hochgevotet.
  • down — Runtergevotet.
  • none — Keine Stimme.
scoreintegerUpvotes minus Downvotes, auch unter null.
Beispiel
{
  "vote": "up",
  "score": 12
}

PlannedReply

Eine eigene Antwort, die für später geplant ist.

FeldTypBedeutung
idstringDie id der geplanten Antwort.
parentIdstringoder nullDie Antwort, auf die sie antworten wird (null, wenn direkt auf den Beitrag).
textstringDer Text.
publishAtintegerWann sie erscheint.
statestringIhr Stand.
  • waiting — Wartet auf ihre Zeit.
  • failed — Konnte nicht gesendet werden, etwa weil der Beitrag weg ist.
Beispiel
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "parentId": null,
  "text": "Count me in for Saturday!",
  "publishAt": 1758710400000,
  "state": "waiting"
}

ReplySettings

Die Antwort-Einstellungen eines eigenen Beitrags.

FeldTypBedeutung
audiencestringWer antworten darf.
  • all — Alle.
  • following — Konten, denen du folgst.
  • mentioned — Im Beitrag Erwähnte.
  • nobody — Niemand außer dir.
approvalbooleanOb Antworten auf deine Freigabe warten.
slowstringDer langsame Modus.
  • auto — Schaltet sich bei vielen Antworten von selbst ein.
  • on — Immer an.
  • off — Aus.
Beispiel
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Counts

Wie viele Antworten, Gefällt-mir und Reposts ein Beitrag hat.

FeldTypBedeutung
repliesintegerAntworten, alle Ebenen zusammen.
likesintegerGefällt-mir.
repostsintegerReposts.
Beispiel
{
  "replies": 4,
  "likes": 31,
  "reposts": 2
}

Media

Ein Bild eines Beitrags oder einer Nachricht.

FeldTypBedeutung
urlstringDie Adresse des Bildes oder Videos, relativ zu dieser Instanz. Lad es mit dem Schlüssel im Header.
kindstringimage, video oder gif (seit 2.10). Videos und GIFs sind MP4-Dateien.
  • image — Ein Bild (WebP oder JPEG).
  • video — Ein Video als MP4, mit Ton.
  • gif — Ein GIF, als stummes MP4 in Schleife.
posterstringoder nullBei Videos und GIFs die Adresse des Vorschaubilds, sonst null (seit 2.10).
aistringoder nullOb das Bild mit KI erstellt wurde, wie die hochladende Person es angegeben oder das Team es nach einer Meldung markiert hat; null ohne Angabe (seit 2.11).
  • with — Mit KI erstellt.
  • without — Ohne KI erstellt.
Beispiel
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null,
  "ai": "without"
}

Poll

Die Umfrage eines Beitrags.

FeldTypBedeutung
optionsPollOption[]Die Antworten, in Reihenfolge. option beim Abstimmen zählt ab 0.
totalintegerAlle Stimmen zusammen, immer vorhanden.
multiplebooleanOb mehr als eine Antwort gewählt werden darf.
endsAtintegeroder nullWann die Umfrage endet (null, wenn sie ohne Ende läuft).
runningbooleanOb noch abgestimmt werden kann.
resultsVisiblebooleanOb die Stimmen je Antwort gezeigt werden (siehe votes).
myVotesinteger[]Die Antworten, die du gewählt hast, ab 0 gezählt.
Beispiel
{
  "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

Eine Antwort einer Umfrage.

FeldTypBedeutung
textstringDie Antwort.
votesintegeroder nullIhre Stimmen (null, solange das Ergebnis zurückgehalten wird).
Beispiel
{
  "text": "Lavender",
  "votes": 12
}

ProfileBrief

Ein Profil, wie es in anderen Objekten erscheint: als Verfasser, in einer Suche.

FeldTypBedeutung
idstringDie ID des Kontos: das, was /relations und /conversations/{with} erwarten.
handlestringDer Kurzname, ohne @, so geschrieben, wie das Mitglied ihn gewählt hat.
namestringDer Anzeigename. Er kann Emojis enthalten, auch :name:.
verifiedbooleanOb das Konto verifiziert ist.
accountKindstringWas für ein Konto es ist.
  • person — Eine Person.
  • business — Ein Unternehmen.
  • association — Ein Verein.
  • automated — Ein automatisiertes Konto, etwa ein Bot.
  • bot — Ein Bot einer Gruppe, gesteuert von einem Programm mit eigenem Schlüssel (seit 2.18).
Beispiel
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person"
}

Profile

Ein Profil für sich, mit Beschreibung und Folgenden.

Jedes Feld von ProfileBrief, und dazu:

FeldTypBedeutung
aboutstringoder nullDie Beschreibung (null, wenn es keine gibt).
websitestringoder nullDie Website des Profils (null, wenn es keine gibt). Seit 2.3.
websiteVerifiedbooleanOb die Website per rel=me auf dieses Profil verlinkt, wöchentlich geprüft. Seit 2.3.
followersintegerWie viele Konten ihm folgen.
createdAtintegeroder nullWann das Konto angelegt wurde (null, solange das Mitglied das Beitrittsdatum ausblendet; seit 2.9).
Beispiel
{
  "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

Die Gruppe, in der ein Beitrag geschrieben wurde.

FeldTypBedeutung
idstringDie ID der Gruppe.
namestringoder nullIhr Name.
Beispiel
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening"
}

Community

Eine Gruppe dieser Instanz.

FeldTypBedeutung
idstringDie ID der Gruppe.
namestringIhr Name.
handlestringoder nullDer Kurzname, mit dem man die Gruppe als @# erwähnt. Seit 2.15.
descriptionstringoder nullDie Beschreibung (null, wenn es keine gibt).
tagsstring[]Die Themen, um die es geht.
membersintegerWie viele Mitglieder sie hat.
joinPolicystringWie man hineinkommt.
  • open — Jede und jeder kann beitreten.
  • application — Beitreten braucht eine Bewerbung, die die Gruppe annimmt.
  • invite — Nur auf Einladung.
visibilitystringWer sie sieht. internal und hidden nur ihre Mitglieder (seit 2.15).
  • open — Für alle sichtbar.
  • internal — Im Verzeichnis nicht zu finden, aber über ihre Adresse.
  • hidden — Nur für ihre Mitglieder.
feedChannelbooleanOb ihr Feed-Kanal an ist. Seit 2.15.
sparksintegerWie viele Funken die Gruppe gerade hält (seit 2.19).
perksstring[]Die Vorteile, die ihre Funken bezahlen (seit 2.19).
membershipMembershipoder nullWas dein Konto in der Gruppe ist und darf; null, wenn es kein Mitglied ist. Seit 2.15.
Beispiel
{
  "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

Was dein Konto in der Gruppe ist und darf.

FeldTypBedeutung
leaderstringoder nullOb du die Gruppe gegründet hast oder mitleitest; null sonst.
  • founder — Gegründet.
  • manager — Mitleitung.
rolesstring[]Die ids deiner Rollen, die höchste zuerst.
permissionsstring[]Was du in der Gruppe darfst.
mutedUntilintegeroder nullBis wann ein Timeout dich hier stummschaltet; null ohne.
Beispiel
{
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "mutedUntil": null
}

Person

Ein Mitglied, kurz.

FeldTypBedeutung
idstringDie id des Kontos.
handlestringDer Nutzername, ohne @.
namestringDer angezeigte Name.
botbooleanOb das Konto ein Bot ist (seit 2.18).
Beispiel
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false
}

Channel

Ein Kanal einer Gruppe.

FeldTypBedeutung
idstringDie id.
kindstringWelche Art Kanal.
  • feed — Der Feed-Kanal, dessen Beiträge auch im öffentlichen Feed stehen.
  • chat — Ein Chat.
  • voice — Ein Sprachkanal; gesprochen wird nur in der App.
  • hub — Der Hub der Gruppe: ihre Seite mit dem, was sie ist. Immer da, ohne Nachrichten.
namestringoder nullDer Name ohne #; null für den Namen, den die App in jeder Sprache gibt.
topicstringDas Thema; leer, wenn es keins gibt.
categoryChannelCategoryoder nullDie Kategorie; null ohne.
unreadintegerWie viele Nachrichten anderer du noch nicht gelesen hast, bis 100.
permissionsstring[]Was du in diesem Kanal darfst.
symbolChannelSymbolSein Symbol; die Form schon die der Gruppe, wenn sie eine vorgibt.
Beispiel
{
  "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

Die Kategorie, unter der ein Kanal steht.

FeldTypBedeutung
idstringDie id.
namestringDer Name.
symbolChannelSymbolIhr Symbol.
Beispiel
{
  "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "name": "Garden",
  "symbol": {
    "emoji": null,
    "icon": null,
    "image": null,
    "color": null,
    "shape": null
  }
}

ChannelSymbol

Das Symbol eines Kanals oder einer Kategorie: höchstens eins von Emoji, Symbol und Bild, sonst das Zeichen seiner Art.

FeldTypBedeutung
emojistringoder nullDas Emoji; null ohne.
iconstringoder nullDer Name des Symbols aus dem Satz der App; null ohne.
imagestringoder nullDie Adresse des eigenen Bildes; null ohne.
colorstringoder nullDie Farbe der Kachel; null für die seiner Art.
shapestringoder nullDie Form der Kachel; null für einen Kreis.
Beispiel
{
  "emoji": "🌻",
  "icon": null,
  "image": null,
  "color": "amber",
  "shape": "circle"
}

ChannelMessage

Eine Nachricht in einem Chat-Kanal.

FeldTypBedeutung
idstringDie id.
textstringoder nullDer Text (null bei einer Nachricht nur aus Bildern oder Sprache).
authorPersonWer sie geschrieben hat.
mediaMedia[]Ihre Bilder und Sprachnachrichten; leer, wenn es keine gibt.
replyTostringoder nullDie id der Nachricht, auf die sie antwortet; null, wenn auf keine.
roleColorstringoder nullDie Farbe der höchsten Rolle des Autors, die eine Farbe hat; null ohne.
threadOfstringoder nullDie Nachricht, in deren Thread diese antwortet; null im Chat.
threadCountintegerWie viele Antworten der Thread dieser Nachricht hat.
cardobjectoder nullDie Karte eines Bots: title, text, color und fields; sonst null.
buttonsobject[]Die Knöpfe eines Bots: je id, label und style.
createdAtintegerWann sie geschrieben wurde.
Beispiel
{
  "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

Eine Rolle einer Gruppe.

FeldTypBedeutung
idstringDie id.
namestringoder nullDer Name; null für @everyone.
everyonebooleanOb es @everyone ist, die Rolle aller Mitglieder.
colorstringoder nullDie Farbe: indigo, violet, rose, amber, green oder teal; null ohne.
permissionsstring[]Ihre Rechte.
membersintegerWie viele sie haben; bei @everyone alle Mitglieder.
editablebooleanOb dein Konto sie ändern darf.
selfablebooleanOb Mitglieder sich die Rolle selbst nehmen und ablegen.
Beispiel
{
  "id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "name": "Gardeners",
  "everyone": false,
  "color": "green",
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "members": 24,
  "editable": true,
  "selfable": false
}

GroupMember

Ein Mitglied einer Gruppe mit seinen Rollen.

Jedes Feld von Person, und dazu:

FeldTypBedeutung
leaderstringoder nullOb das Mitglied die Gruppe gegründet hat oder mitleitet; null sonst.
  • founder — Gegründet.
  • manager — Mitleitung.
rolesstring[]Die ids seiner Rollen, die höchste zuerst.
mutedUntilintegeroder nullBis wann ein Timeout das Mitglied stummschaltet, wenn dein Konto Timeouts geben darf; sonst null.
Beispiel
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false,
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "mutedUntil": null
}

ChannelOverride

Was eine Rolle in einem Kanal anders darf als in der Gruppe.

FeldTypBedeutung
rolestringDie id der Rolle.
allowstring[]Was sie hier zusätzlich darf.
denystring[]Was sie hier nicht darf.
Beispiel
{
  "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "allow": [
    "send"
  ],
  "deny": []
}

Bell

Die Glocke einer Gruppe.

FeldTypBedeutung
levelstringWelche Mitteilungen kommen.
  • all — Jeder neue Beitrag im Feed-Kanal, dazu @everyone.
  • important — Beiträge der Leitung im Feed-Kanal, dazu @everyone.
  • off — Nichts, außer du wirst mit @Name erwähnt.
Beispiel
{
  "level": "important"
}

InviteLink

Ein Einladungslink einer Gruppe.

FeldTypBedeutung
codestringDer Code.
urlstringDie Adresse zum Teilen.
createdByPersonoder nullWer ihn erstellt hat; null, wenn das Konto gelöscht ist.
createdAtintegerWann er erstellt wurde.
expiresAtintegeroder nullBis wann er gilt; null ohne Ablauf.
usesintegerWie oft er genutzt wurde.
maxUsesintegeroder nullWie oft er genutzt werden kann; null beliebig oft.
Beispiel
{
  "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

Wohin ein Einladungslink führt.

FeldTypBedeutung
communityInviteGroupDie Gruppe.
memberbooleanOb dein Konto schon Mitglied ist.
Beispiel
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

InviteGroup

Die Gruppe hinter einem Einladungslink.

FeldTypBedeutung
idstringDie id.
namestringDer Name.
membersintegerWie viele Mitglieder sie hat.
rulesstring[]Ihre Regeln, die man beim Beitritt annimmt; leer, wenn es keine gibt.
Beispiel
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "members": 312,
  "rules": [
    "Be kind.",
    "No advertising."
  ]
}

Joined

Der Beitritt mit einem Einladungslink.

FeldTypBedeutung
communitystringDie id der Gruppe.
Beispiel
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

LogEntry

Ein Eintrag im Protokoll der Leitung.

FeldTypBedeutung
idstringDie id.
actionstringWas geschah.
  • post_removed — Ein Beitrag.
  • member_removed — Ein Mitglied entfernt, vor 2.16 (mit 90 Tagen Sperre).
  • message_removed — Eine Nachricht in einem Chat-Kanal.
  • member_kicked — Ein Kick.
  • member_banned — Ein Bann.
  • member_unbanned — Ein aufgehobener Bann.
  • member_timed_out — Ein Timeout.
  • timeout_lifted — Ein aufgehobener Timeout.
  • voice_muted — Im Sprachkanal stummgeschaltet.
  • voice_removed — Aus dem Sprachkanal getrennt.
  • bot_added — Ein Bot wurde in die Gruppe aufgenommen (seit 2.18).
  • bot_removed — Ein Bot wurde aus der Gruppe entfernt (seit 2.18).
memberPersonWen es betraf.
reasonstringDie Begründung; leer bei Nachrichten und wenn keine gegeben wurde.
bystringoder nullDer Name, wer es getan hat; null, wenn das Konto gelöscht ist.
createdAtintegerWann.
Beispiel
{
  "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

Ein Bann aus einer Gruppe.

FeldTypBedeutung
memberPersonWer gebannt ist.
untilintegeroder nullBis wann; null, bis er aufgehoben wird.
createdAtintegeroder nullSeit wann; null bei Banns von vor 2.16.
bystringoder nullDer Name, wer gebannt hat; null, wenn unbekannt.
Beispiel
{
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "until": 1759228800000,
  "createdAt": 1758624000000,
  "by": "Mara 🌻"
}

Until

Wann ein Timeout oder Bann endet.

FeldTypBedeutung
untilintegeroder nullDer Zeitpunkt; null bei einem Bann ohne Ende oder einem aufgehobenen Timeout.
Beispiel
{
  "until": 1758624600000
}

Tag

Ein Tag und wie viele Beiträge ihn tragen.

FeldTypBedeutung
tagstringDer Tag, ohne #.
postsintegerWie viele neuere Beiträge ihn tragen.
Beispiel
{
  "tag": "garden",
  "posts": 58
}

SearchResult

Drei Listen, notfalls leer.

FeldTypBedeutung
postsPost[]Passende Beiträge, neueste zuerst.
profilesProfileBrief[]Passende Profile, nach Kurzname.
tagsTag[]Passende Tags, meistbenutzte zuerst.
Beispiel
{
  "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

Ein Emoji dieser Instanz.

FeldTypBedeutung
namestringDer Name, wie er zwischen den Doppelpunkten steht.
urlstringDie Adresse des Bildes, relativ zu dieser Instanz.
Beispiel
{
  "name": "tellmelo",
  "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
}

Notification

Eine Mitteilung. Eine Zeile kann mehrere Ereignisse derselben Art sammeln.

FeldTypBedeutung
idstringDie ID der Mitteilung.
kindstringWas passiert ist.
  • reply — Jemand hat dir geantwortet.
  • like — Jemandem gefällt dein Beitrag.
  • reply_like — Jemand votet deine Antwort hoch.
  • duel — Jemand fordert dich zum Duell der Feeds heraus, oder deine Herausforderung ist gespielt.
  • reply_pick — Wer den Beitrag geschrieben hat, hebt deine Antwort hervor.
  • repost — Jemand hat deinen Beitrag geteilt.
  • follow — Jemand folgt dir.
  • mention — Jemand hat dich erwähnt.
  • group_mention — Jemand hat eine Gruppe erwähnt, die du leitest; text ist ihr Name.
  • channel_mention — Jemand hat dich in einem Chat-Kanal einer deiner Gruppen erwähnt, auch mit @everyone; das Mitglied steht als actor, Kanal und Gruppe stehen im Satz, nie die Nachricht.
  • message — Jemand hat dir eine Nachricht geschrieben.
  • scheduled — Ein geplanter Beitrag von dir ist erschienen.
  • video — Ein Beitrag von dir, der auf sein Video gewartet hat, ist erschienen oder wieder zum Entwurf geworden.
  • reminder — Eine Erinnerung an einen gespeicherten Beitrag ist fällig.
  • report — Was aus einer Meldung geworden ist, die du geschickt hast.
  • moderation — Eine Entscheidung über dein Konto: eine Verwarnung, eine Einschränkung, ein Widerspruch.
  • team — Neue Arbeit fürs Team (nur Inhaber, Admins und Moderatoren).
  • reward — Eine Belohnung fürs Einladen droht wegzufallen oder ist weggefallen.
  • gift — Ein Geschenk vom Team: ein Abo, oder Funken an dich oder an eine Gruppe, die du leitest.
  • present — Ein Geschenk eines Mitglieds: Funken oder Abo-Zeit; das Mitglied steht als actor.
  • spark — Funken laufen bald ab, oder einer Gruppe, die du leitest, reichen die Funken nicht mehr für ihre Vorteile.
  • loyalty — Rund um den Treue-Rhythmus: Eine aktive Woche zählt oder es fehlt ihr noch ein Tag, eine Belohnung ist neu oder droht zu verfallen.
  • impact — Wie deine Beiträge der ersten zwölf Stunden nach einem Tag ankamen, in einer Mitteilung.
  • discovery — Eine Einladung in das Entdecken-Programm, oder dass ein Platz dort beginnt oder endet.
  • group_post — Ein neuer Beitrag in einer Gruppe, deren Glocke dafür läutet.
  • group_moderation — Die Leitung einer Gruppe hat einen deiner Beiträge oder dich aus der Gruppe entfernt.
  • group — Etwas, das ein Mitglied in einer Gruppe mit dir getan hat: eingeladen, aufgenommen oder abgelehnt, zur Mitleitung gemacht, die Gruppe übergeben oder aufgelöst, oder sich in deiner Gruppe beworben; das Mitglied steht als actor, der Name der Gruppe am Ende des Satzes.
  • coauthor — Jemand hat dich als Mitautor eines Beitrags eingeladen.
  • partner — Eine Erinnerung aus dem Partnerprogramm oder das Ende des Partner-Abzeichens.
  • news — Ein neuer Artikel in einer Region, der du folgst.
  • pick — Ein Beitrag von dir steht zur Wahl für den Beitrag der Woche oder des Jahres, oder er hat gewonnen.
  • advent — Ein neues Türchen des Adventskalenders ist offen, eines wurde geöffnet oder das von heute wartet noch.
  • team_message — Eine Nachricht, die das tellmelo-Team an ausgewählte Mitglieder geschrieben hat.
  • challenge — Eine neue Challenge der Woche hat begonnen.
  • nudge — Einmalig: ein Beitrag, auf den noch niemand geantwortet hat, oder die laufende Challenge.
  • signin — Ein Computer fragt, ob du dich dort gerade anmeldest.
textstringoder nullNur bei Meldungen und Moderation der zugehörige Text, sonst null.
actorActorWer es getan hat.
postIdstringoder nullDer Beitrag, um den es geht (null, wenn es um keinen geht).
readbooleanOb sie als gelesen markiert ist.
moreintegerFür wie viele weitere Ereignisse diese Zeile steht, über das genannte hinaus.
createdAtintegerWann es zum ersten Mal passiert ist.
updatedAtintegerWann sie zuletzt ein weiteres Ereignis gesammelt hat. Danach ist die Liste sortiert.
Beispiel
{
  "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

Wer eine Mitteilung ausgelöst hat.

FeldTypBedeutung
handlestringDer Kurzname.
namestringDer Anzeigename.
Beispiel
{
  "handle": "jon",
  "name": "Jon"
}

Conversation

Eine Zeile deines Postfachs.

FeldTypBedeutung
withstringDie ID des anderen Kontos: das, was /conversations/{with}/messages erwartet.
handlestringSein Kurzname.
namestringSein Anzeigename.
excerptstringoder nullDer Anfang der letzten Nachricht (null, wenn sie keinen Text hat).
truncatedbooleanOb der Anfang gekürzt wurde.
fromMebooleanOb die letzte Nachricht von dir ist.
lastMessageIdstringDie ID der letzten Nachricht.
unreadintegerWie viele seiner Nachrichten du noch nicht gelesen hast.
updatedAtintegerWann die letzte Nachricht geschrieben wurde.
Beispiel
{
  "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

Eine Nachricht in einem Gespräch.

FeldTypBedeutung
idstringDie ID der Nachricht.
textstringoder nullDer Text (null bei einer Nachricht, die nur aus Bildern besteht).
fromstringDie ID des Kontos, das sie geschrieben hat.
tostringDie ID des Kontos, an das sie ging.
readbooleanOb die Empfängerin oder der Empfänger sie gelesen hat.
mediaMedia[]Ihre Bilder; leer, wenn es keine gibt.
replyTostringoder nullDie id der Nachricht, auf die diese antwortet (null, wenn sie auf keine antwortet). Seit 2.2.
createdAtintegerWann sie gesendet wurde.
Beispiel
{
  "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

Eine eigene Nachricht, die für später geplant ist.

FeldTypBedeutung
idstringDie id der geplanten Nachricht.
tostringDie id des Kontos, das sie erhält.
textstringoder nullDer Text, null bei Ende-zu-Ende-Verschlüsselung.
sendAtintegerWann sie gesendet wird.
statestringIhr Stand.
  • waiting — Wartet auf ihre Zeit.
  • held — Zurückgehalten, weil das Abo endete. Du kannst sie selbst senden oder löschen.
  • failed — Konnte nicht gesendet werden.
Beispiel
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "text": "Happy birthday! 🎂",
  "sendAt": 1758710400000,
  "state": "waiting"
}

ScheduledPost

Ein eigener Beitrag, der noch nicht erschienen ist.

FeldTypBedeutung
idstringDie id des Beitrags.
textstringoder nullDer Text.
communityIdstringoder nullDie Gruppe, in der er erscheint (null außerhalb von Gruppen).
publishAtintegeroder nullWann er erscheint (null, solange er auf etwas anderes wartet).
deleteAtintegeroder nullWann er sich von selbst löscht (null: nie).
waitingForstringWorauf er wartet.
  • time — Auf seine Zeit.
  • review — Auf die Freigabe eines Textes, der zur Prüfung geschrieben wurde.
  • check — Auf die Prüfung durch die automatische Moderation.
  • payment — Auf die Bezahlung seiner Geschenke.
createdAtintegerWann er geschrieben wurde.
Beispiel
{
  "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

Eine Sammlung gemerkter Beiträge.

FeldTypBedeutung
idstringDie id der Sammlung.
namestringIhr Name.
countintegerWie viele Beiträge darin sind.
Beispiel
{
  "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
  "name": "Recipes",
  "count": 12
}

Event

Ein anstehender Termin eines Profils.

FeldTypBedeutung
idstringDie id des Termins.
titlestringDer Titel.
startsAtintegerBeginn.
endsAtintegeroder nullEnde, null ohne Ende.
placestringoder nullDer Ort.
descriptionstringoder nullDie Beschreibung.
signupsEventSignupsoder nullDie Anmeldungen, null ohne Anmeldung.
Beispiel
{
  "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

Wie viele angemeldet sind.

FeldTypBedeutung
countintegerDie Zahl der Anmeldungen.
goingbooleanOb du angemeldet bist.
Beispiel
{
  "count": 14,
  "going": true
}

EventSignup

Jemand, der sich für einen deiner Termine angemeldet hat.

FeldTypBedeutung
idstringDie id des Kontos.
handlestringDas Kürzel.
namestringDer Anzeigename.
atintegerWann angemeldet.
Beispiel
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "at": 1758624000000
}

Picture

Ein hochgeladenes Bild.

FeldTypBedeutung
idstringDie id des Bildes.
urlstringWo es zu sehen ist.
Beispiel
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

EmojiPicture

Das hochgeladene Bild eines Emojis.

FeldTypBedeutung
idstringDie id des Bildes.
urlstringWo es zu sehen ist.
animatedbooleanOb es sich bewegt.
Beispiel
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

OwnEmoji

Eines deiner eigenen Emojis.

FeldTypBedeutung
namestringSein Name.
urlstringSein Bild.
animatedbooleanOb es sich bewegt.
restingbooleanRuht, weil das Abo gerade weniger Emojis erlaubt: Es bleibt, ist aber nicht nutzbar.
Beispiel
{
  "name": "sunflower",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false,
  "resting": false
}

GroupEmoji

Ein Emoji einer Gruppe.

FeldTypBedeutung
namestringSein Name.
urlstringSein Bild.
animatedbooleanOb es sich bewegt.
Beispiel
{
  "name": "seedling",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

BotEvent

Ein Ereignis in einer Gruppe des Bots.

FeldTypBedeutung
idstringSeine Nummer, aufsteigend; mit ihr geht es weiter (since, Last-Event-ID).
typestringWas geschah.
  • message.created — Eine Nachricht wurde geschrieben.
  • message.deleted — Eine Nachricht wurde gelöscht.
  • member.joined — Jemand ist beigetreten.
  • member.left — Jemand ist gegangen oder wurde entfernt.
  • voice.joined — Jemand ist einem Sprachkanal beigetreten.
  • command — Jemand hat einen Befehl des Bots benutzt.
  • interaction — Jemand hat einen Knopf in einer Nachricht des Bots gedrückt.
communitystringDie Gruppe.
channelstringoder nullDer Kanal; null für die ganze Gruppe.
createdAtintegerWann es geschah.
dataobjectWas dazu gehört, je nach Art: message, member (mit reason), command oder interaction.
Beispiel
{
  "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

Ein Befehl eines Bots.

FeldTypBedeutung
namestringSein Name, ohne „/“.
descriptionstringWas er tut.
Beispiel
{
  "name": "dice",
  "description": "Rolls a die"
}

VoiceSeat

Ein Platz im Sprachkanal.

FeldTypBedeutung
urlstringDie Adresse des Medienservers (LiveKit).
tokenstringDas Token für diesen Kanal, einige Minuten gültig.
iceServersobject[]Die STUN- und TURN-Server für die Verbindung.
speakbooleanOb der Bot dort Ton senden darf.
videobooleanOb der Bot dort Bild senden darf.
Beispiel
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Webhook

Einer deiner Webhooks.

FeldTypBedeutung
idstringDie id des Webhooks.
urlstringSeine Adresse.
kindsstring[]Worüber er Bescheid bekommt.
activebooleanOb er zugestellt bekommt. Nach vielen Fehlschlägen in Folge wird er abgeschaltet.
lastStatusintegeroder nullDer HTTP-Status der letzten Zustellung.
lastAtintegeroder nullWann zuletzt zugestellt wurde.
failuresintegerFehlschläge in Folge.
Beispiel
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "url": "https://example.org/tellmelo-hook",
  "kinds": [
    "reply",
    "mention"
  ],
  "active": true,
  "lastStatus": 200,
  "lastAt": 1758624000000,
  "failures": 0
}

WebhookCreated

Ein neuer Webhook mit seinem Geheimnis.

FeldTypBedeutung
idstringDie id des Webhooks.
secretstringDas Geheimnis für die Signaturen, nur dieses eine Mal.
Beispiel
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

GroupBot

Ein Bot einer Gruppe.

FeldTypBedeutung
idstringDie id des Bot-Kontos.
handlestringSein Kürzel.
namestringSein Name.
descriptionstringWas er tut, in den Worten seines Besitzers.
permissionsstring[]Was seine Rolle in der Gruppe erlaubt.
Beispiel
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "gardenbot",
  "name": "Garden bot",
  "description": "Reminds the group of watering days.",
  "permissions": [
    "send",
    "view"
  ]
}

VoiceRoom

Ein Sprachkanal mit den Menschen darin.

FeldTypBedeutung
channelstringDie id des Kanals.
peopleVoicePerson[]Wer gerade drin ist.
Beispiel
{
  "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

Jemand in einem Sprachkanal.

FeldTypBedeutung
idstringDie id des Kontos.
handlestringDas Kürzel.
namestringDer Anzeigename.
mutedbooleanOb das Mikrofon aus ist.
deafbooleanOb die Person nichts hört (selbst gewählt).
camerabooleanOb die Kamera an ist.
screenbooleanOb der Bildschirm geteilt wird.
Beispiel
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "muted": true,
  "deaf": false,
  "camera": false,
  "screen": false
}

GiftDrop

Geschenke unter einem Beitrag – nie mit den Namen derer, die abgeholt haben.

FeldTypBedeutung
itemstringWas ein Platz enthält.
  • plan — Abo-Monate (Unterstützer).
  • sparks — Funken.
quantityintegerWie viel jeder Platz enthält: Monate oder Funken.
placesintegerWie viele Plätze es insgesamt gibt.
leftintegerWie viele noch frei sind.
audiencestringWer abholen darf.
  • all — Alle.
  • followers — Nur Follower der Person, die verteilt.
  • group — Nur Mitglieder der Gruppe des Beitrags.
newAccountsbooleanOb auch Konten unter 7 Tagen abholen dürfen.
statusstringDer Stand.
  • awaiting_payment — Wartet auf die Bezahlung; der Beitrag ist noch nicht erschienen.
  • open — Es gibt noch Plätze zum Abholen.
  • closed — Vorbei: alles vergeben, die Zahlung erstattet oder der Beitrag gelöscht.
claimedbooleanOb du selbst schon einen Platz hast (bei öffentlichen Pfaden immer false).
Beispiel
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": true
}

OwnGiftDrop

Deine Geschenke unter einem Beitrag, mit Beitrag und Bezahlung.

Jedes Feld von GiftDrop, und dazu:

FeldTypBedeutung
postIdstringDer Beitrag, unter dem sie stehen.
fundingstringWie sie bezahlt sind.
  • free — Kostenlos.
  • quota — Aus dem Kontingent.
  • payment — Bezahlt.
createdAtintegerWann sie angelegt wurden.
Beispiel
{
  "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

Was in einem Kontingent steckt.

FeldTypBedeutung
monthsintegerAbo-Monate, die noch zu verschenken sind.
sparksintegerFunken, die noch zu verschenken sind.
looksQuotaLook[]Looks im Vorrat, die noch zu verschenken sind (seit 2.13).
Beispiel
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

QuotaLook

Ein Look im Vorrat eines Partners, mit der Zahl der übrigen Stücke (seit 2.13).

FeldTypBedeutung
idstringKennung des Looks; beim Verschenken als itemId.
namestringName des Looks.
kindstringArt des Looks.
  • frame — Profilrahmen.
  • background — Titelbild-Effekt.
  • card — Profilkarte.
quantityintegerWie viele Stück noch übrig sind.
Beispiel
{
  "id": "frame-gold",
  "name": "Goldring",
  "kind": "frame",
  "quantity": 25
}

QuotaGift

Ein Geschenk aus dem Kontingent.

FeldTypBedeutung
itemstringWas verschenkt wurde.
  • plan — Abo-Monate (Unterstützer).
  • sparks — Funken.
  • shop — Ein Look aus dem Vorrat (seit 2.13).
quantityintegerWie viel.
itemIdstringoder nullDer verschenkte Look, wenn item shop ist; sonst null.
recipientActorAn wen.
createdAtintegerWann.
Beispiel
{
  "item": "plan",
  "quantity": 3,
  "itemId": null,
  "recipient": {
    "handle": "jon",
    "name": "Jon"
  },
  "createdAt": 1758627600000
}

MediaItem

Ein GIF oder Video aus der Mediathek (seit 2.14).

FeldTypBedeutung
idstringDie ID; für media beim Posten.
kindstringGIF oder Video.
  • gif — Ein GIF, als stumme MP4 in Schleife.
  • video — Ein Video als MP4, mit Ton.
namestringDer Name.
keywordsstringDie Stichwörter, klein geschrieben.
widthintegerBreite in Pixeln.
heightintegerHöhe in Pixeln.
secondsintegerLänge in Sekunden; bei GIFs 0.
urlstringDie MP4-Datei, relativ zu dieser Instanz. Lad sie mit dem Schlüssel im Header.
posterstringDas Vorschaubild, ebenso mit dem Schlüssel.
uploaderActorWer es hochgeladen hat.
minebooleanOb es deines ist.
sharedbooleanOb es für alle auf tellmelo geteilt ist.
anywherebooleanOb es auch auf anderen Websites erscheinen darf.
embedEmbedoder nullDie Adressen für andere Websites; null, solange es dort nicht erlaubt ist.
Beispiel
{
  "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

Die Adressen für andere Websites. Sie funktionieren ohne Schlüssel.

FeldTypBedeutung
pagestringDer Player für ein <iframe>.
filestringDie MP4-Datei für einen eigenen Player.
posterstringDas Vorschaubild.
codestringDer fertige Code zum Einbinden.
Beispiel
{
  "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

Ein begonnenes Hochladen.

FeldTypBedeutung
uploadstringDie ID dieses Hochladens.
pieceintegerWie groß ein Stück höchstens sein darf, in Bytes.
Beispiel
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

UploadPiece

Ein angekommenes Stück.

FeldTypBedeutung
receivedintegerWie viele Bytes angekommen sind.
itemMediaItemoder nullNach dem letzten Stück das neue GIF oder Video, sonst null.
Beispiel
{
  "received": 4194304,
  "item": null
}

Created

Die Antwort eines Schreibzugriffs, der etwas angelegt hat.

FeldTypBedeutung
idstringDie ID dessen, was angelegt wurde.
scheduledForintegeroder nullWann es erscheint, wenn die Veröffentlichung geplant wurde (sonst null).
deleteAtintegeroder nullWann es sich selbst löscht, wenn das eingestellt wurde (sonst null).
Beispiel
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

DropCreated

Die Antwort, wenn ein Beitrag mit Geschenken angelegt wurde.

FeldTypBedeutung
idstringDie id des neuen Beitrags.
fundingstringWie die Geschenke bezahlt sind.
  • free — Kostenlos.
  • quota — Aus dem Kontingent.
Beispiel
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Made

Was gerade angelegt oder geändert wurde.

FeldTypBedeutung
idstringDie id, bei einem Einladungslink sein Code.
Beispiel
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Ok

Die Antwort eines Schreibzugriffs, der nichts zurückzugeben hat.

FeldTypBedeutung
okbooleanImmer true.
Beispiel
{
  "ok": true
}

Die maschinenlesbare Beschreibung

Die Tabelle hinter dieser Seite liegt als OpenAPI unter https://api.tellmelo.com/v2/openapi.json.

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

GIFs und Videos auf anderen Websites

Was ein Mitglied teilt und auch auf anderen Websites erlaubt, kann jede Website zeigen: Die Suche mit anywhere=true findet es, und sein embed hat die Adressen. Nimmt das Mitglied es zurück, verschwindet es dort innerhalb von Minuten.

Hochladen in Stücken

Zuerst beginnen, dann die Datei in Stücken senden. Eine größere Datei teilst du in Stücke von piece Bytes, mit offset an der jeweiligen Stelle. Nach dem letzten Stück kommt das fertige GIF oder 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": { … } } }

Einbinden

Der Player zeigt das GIF in Schleife oder das Video mit Steuerung, darunter den Namen und wer es geteilt hat. Setz den Code aus embed.code in die Seite:

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

Foren und Programme, die oEmbed kennen, holen sich den Code selbst, wenn man ihnen die Adresse des Players gibt:

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

Der Schlüssel gehört auf deinen Server, nie in den Code einer Website. Such und lade über deinen Server hoch; die Adressen in embed brauchen keinen Schlüssel.

GIF-Auswahl für deine Website

Mit einem Seiten-Schlüssel (Developer-Bereich → GIF-Auswahl für deine Website) bekommt deine Website eine fertige Suche: zwei Zeilen in die Seite, ein Klick auf den Knopf öffnet sie. Der Schlüssel ist öffentlich und gilt nur auf den Adressen, die du dafür einträgst. Die Auswahl zeigt nur, was Mitglieder für andere Websites erlaubt haben.

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

Beim Auswählen meldet der Knopf tellmelo:pick mit dem Eintrag: code zum Einbetten, file, poster, name und author. Mit data-target="#feld" fügt er code gleich in ein Textfeld ein, mit data-kind="video" sucht er Videos. Zeig den Namen der Person, die es geteilt hat, wenn du die Datei selbst einbindest.

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

Mit tellmelo anmelden

Andere Seiten lassen Mitglieder sich über OpenID Connect mit ihrem tellmelo-Konto anmelden (Autorisierungscode mit PKCE). Die Seite erhält nur den Nutzernamen, die bestätigte E-Mail-Adresse und je Mitglied eine eigene Kennung (sub).

Du beantragst eine App unter „Developer-Bereich → Mit tellmelo anmelden“. Das Team prüft jede App; danach siehst du dort die Client-ID und erstellst bei Apps mit Server das Client-Geheimnis, das einmal angezeigt wird.

Alles, was eine Bibliothek braucht, steht im Discovery-Dokument:

https://tellmelo.com/.well-known/openid-configuration
  1. Schicke das Mitglied zu /oauth/authorize mit response_type=code, client_id, redirect_uri (genau wie eingetragen), scope=openid profile email, state, nonce und code_challenge mit code_challenge_method=S256.
  2. Tausche den Code innerhalb einer Minute bei /oauth/token ein: grant_type=authorization_code, code, redirect_uri und code_verifier; Apps mit Server schicken dazu das Geheimnis per Basic-Anmeldung oder im Formular.
  3. Das ID-Token (RS256, Schlüssel unter /oauth/jwks) enthält sub, mit profile auch preferred_username, mit email auch email und email_verified. Das Access-Token gilt 10 Minuten und liest nur /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
}

Es gibt keine Refresh-Tokens: tellmelo meldet an und gibt keinen dauerhaften Zugriff. Entfernt ein Mitglied die Seite oder setzt das Team die App aus, antwortet /oauth/userinfo sofort mit 401. prompt=none prüft ohne Seite, prompt=consent fragt erneut.

Was wir erwarten

Es gelten dieselben Regeln wie überall: keine Belästigung, kein Spam, keine fremden Inhalte ohne Recht daran. Für das, was dein Schlüssel schreibt, stehst du gerade.

GIFs und Videos anderer zeigst du auf deiner Website nur, wenn sie embed haben, über diese Adressen und mit dem Namen der Person, die es geteilt hat. Ist etwas nicht mehr verfügbar, zeigst du es nicht weiter. Kopier die Dateien nicht in eine eigene Sammlung.

ImpressumDatenschutzNutzungsbedingungenStatusApps