tellmelotellmelo.
ImpressumDatenschutzNutzungsbedingungenUrheberrecht meldenKontaktAPIApps

API

Einstieg

  • Überblick
  • Schnellstart
  • Dein Schlüssel
  • Was ein Schlüssel darf
  • Was kein Schlüssel kann

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}
  • Antworten
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
  • Umfragen
    • POST /posts/{id}/vote
  • Profile
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
  • Communities
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
  • Entdecken
    • GET /tags
    • GET /search
    • GET /emojis
  • Dein Konto
    • GET /me
    • GET /feed
  • Mitteilungen
    • GET /notifications
    • POST /notifications/read
  • Nachrichten
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
  • Beziehungen
    • POST /relations

Objekte

  • Objekte
  • Service
  • RateLimit
  • Post
  • Reply
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • Created
  • Ok

Weiteres

  • Die maschinenlesbare Beschreibung
  • Was aus v1 geworden ist
  • Was wir erwarten
Inhalt

Einstieg

  • Überblick
  • Schnellstart
  • Dein Schlüssel
  • Was ein Schlüssel darf
  • Was kein Schlüssel kann

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}
  • Antworten
    • GET /posts/{id}/replies
    • POST /posts/{id}/replies
  • Umfragen
    • POST /posts/{id}/vote
  • Profile
    • GET /profiles/{handle}
    • GET /profiles/{handle}/posts
  • Communities
    • GET /communities
    • GET /communities/{id}
    • GET /communities/{id}/posts
  • Entdecken
    • GET /tags
    • GET /search
    • GET /emojis
  • Dein Konto
    • GET /me
    • GET /feed
  • Mitteilungen
    • GET /notifications
    • POST /notifications/read
  • Nachrichten
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
  • Beziehungen
    • POST /relations

Objekte

  • Objekte
  • Service
  • RateLimit
  • Post
  • Reply
  • Counts
  • Media
  • Poll
  • PollOption
  • ProfileBrief
  • Profile
  • CommunityBrief
  • Community
  • Tag
  • SearchResult
  • Emoji
  • Notification
  • Actor
  • Conversation
  • Message
  • Created
  • Ok

Weiteres

  • Die maschinenlesbare Beschreibung
  • Was aus v1 geworden ist
  • Was wir erwarten

Überblick

v2 ist die API von tellmelo für eigene Programme. Jede Anfrage trägt einen Schlüssel, jede Antwort ist JSON, und jede Liste blättert auf dieselbe Weise. Was hinter einem Schlüssel geschieht, läuft durch dieselben Regeln wie ein Klick in der Anwendung: Tempolimits, Aussetzungen, entzogene Rechte und die Einstellungen dieser Instanz gelten hier genauso.

  • Jeder Pfad beginnt mit /api/v2 unter der Adresse dieser Instanz, der, die in den Beispielen auf dieser Seite steht.
  • Anfragen und Antworten sind JSON in UTF-8. Feldnamen, Codes und Werte sind englisch und bleiben es.
  • Ein Schlüssel handelt als dein Konto und nie darüber hinaus: Was du in der Anwendung nicht sehen kannst, kann auch kein Schlüssel lesen.
https://tellmelo.com/api/v2

Schnellstart

  1. Leg unter „Einstellungen → App & Daten → API“ einen Schlüssel an und kopier ihn. Er wird nur ein einziges Mal gezeigt.
  2. Frag damit die Wurzel ab. Die Antwort sagt, welche Version läuft, was der Schlüssel darf und wie viele Anfragen er in dieser Minute noch hat.
  3. Ab da funktioniert jeder Pfad gleich: der Schlüssel im Header, JSON zurück, und bei Listen items und next.
curl -H "Authorization: Bearer tm_key_…" https://tellmelo.com/api/v2
{
  "name": "tellmelo",
  "version": "2.6",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/legal/api",
  "spec": "/api/v2/openapi.json"
}

Wie es weitergeht: /me für dein eigenes Profil, /posts für das Öffentliche, /feed für das, was dir die Anwendung zeigt.

Dein Schlüssel

Es gibt genau einen Schlüssel je Konto, gebunden an deine Benutzerkennung. Er beginnt mit tm_key_, damit ein Scanner ihn dort erkennt, wo er nicht hingehört. Er wird genau einmal angezeigt, im Augenblick seiner Erzeugung; danach liegt hier nur noch sein Fingerabdruck, niemand kann ihn dir zurücklesen, wir nicht und du nicht. Wer ihn verlegt, legt einen neuen an; der alte gilt von da an nicht mehr.

Du legst ihn unter „Einstellungen → App & Daten → API“ an. Er geht im Kopf der Anfrage mit, als Authorization: Bearer tm_key_… oder als X-Tellmelo-Key. Nicht in der Adresszeile, denn was dort steht, landet in Zugriffsprotokollen, im Verlauf des Browsers und im Referer jedes Verweises.

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

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

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

Nicht in der Adresszeile. Was dort steht, landet im Zugriffsprotokoll jedes Servers dazwischen, im Verlauf des Browsers und im Referer jedes Verweises. Ein Schlüssel gehört dort nicht hin.

Derselbe Schlüssel lädt auch Bilder. Jede url in einer Antwort zeigt auf /api/media dieser Instanz; schick den Schlüssel auch dort im Header mit, dann kommt das Bild zurück, soweit dein Konto es sehen darf.

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

Was ein Schlüssel darf

Ein Schlüssel trägt zwei Rechte, und jeder Weg in den Tabellen unten sagt, welches davon er braucht. Zwei und nicht fünf: Ein Recht, das man sich nicht in einem Satz erklären kann, ist ein Recht, das man ungelesen anhakt. Und die ehrliche Linie verläuft zwischen Schauen und Ändern.

  • read: schauen. Die öffentlichen Beiträge, Profile, Communities und Tags, und dein eigenes Konto, so wie du es siehst: Feed, Mitteilungen, Gespräche, Nachrichten.
  • write: ändern. Alles, was unter deinem Namen geschieht: veröffentlichen, antworten, abstimmen, Nachrichten senden, folgen, beitreten, blockieren, Mitteilungen als gelesen markieren.

Was kein Schlüssel kann

Kein Schlüssel reicht an deine Kontodaten: kein Passwort, keine E-Mail-Adresse, keine Kontoart, kein Ort, keine Rolle, keine Löschung. Auch keine Sitzungen, keine Push-Geräte und die Schlüssel selbst nicht. Einer, der Schlüssel ausstellen könnte, ließe sich nicht mehr abschalten. Auch keine Verwaltung und keine Community-Leitung, denn eine Community aufzulösen oder weiterzugeben ist eine Entscheidung über fremde Beiträge. Was das Passwort hütet, darf kein Schlüssel: Ein Geheimnis, das in einem Skript auf fremder Maschine liegt, darf nicht können, was die Anmeldung kann. Ein Konto zu übernehmen kostet weiterhin die Anmeldung.

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-Objekt im Körper. Parameter in der Adresse ergänzen, was der Körper nicht nennt; nennen beide dasselbe Feld, gilt der Körper.
  • Zeiten sind ganze Millisekunden seit dem 1. Januar 1970, UTC, so, wie die Datenbank sie hält. Es gibt keine Zeitzone, die man falsch lesen kann.
  • IDs sind Zeichenketten. Nimm sie nicht auseinander und verlass dich nicht auf ihre Form; vergleich sie nur als Ganzes.
  • Jedes Feld ist immer da. Was es nicht gibt, ist null, nie fehlend; eine Anzahl ist immer eine Zahl, eine Liste immer eine Liste, 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 Adressen relativ zu dieser Instanz, /api/media?id=…. Lad sie mit demselben Schlüssel im Header; ohne ihn lautet die Antwort 401.

Seiten

Jede Liste nimmt limit und cursor und antwortet mit items und next. Weiter geht es, indem du das next der letzten Antwort als cursor zurückschickst; ist next leer, ist das Ende erreicht. Eine volle Seite kann trotzdem die letzte sein; wer erst bei einer leeren Seite aufhört, fragt einmal zu oft. Der Cursor ist undurchsichtig: ein Platz in einer Liste, kein Zeitpunkt. Nimm ihn nicht auseinander und baue keinen selbst; was darin steht, darf sich ändern, ohne dass sich ein Weg ändert.

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

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

Eine Seite hält ohne limit 20 Einträge, höchstens 50. Ein paar Listen werden gar nicht geblättert. Das steht bei ihrem Pfad, und ihr next ist immer null.

Nur das Neue

Jede Antwort trägt ein ETag. Ein Programm, das immer wieder fragt, sollte das letzte als If-None-Match zurückschicken: Hat sich seitdem nichts geändert, ist die Antwort 304 und trägt keinen Rumpf. Das ist der Unterschied zwischen einer Liste, die jede Minute über die Leitung geht, und einer, die geht, wenn etwas drinsteht, für deine Maschine so wie für diese.

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

Zwei Ausnahmen, beide mit Absicht: /feed trägt kein ETag, weil sich seine Reihenfolge mit der Zeit bewegt und jede Antwort anders ist; und ein Schreibzugriff antwortet nie 304. Zwei gleiche Beiträge sind zwei Beiträge.

Grenzen

Ein Schlüssel darf 120 Anfragen je Minute stellen, mit dem Abo „Organisation“ 600, sofern die Verwaltung ihm keine andere Zahl gesetzt hat. Die Grenze gilt je Schlüssel, nicht je Konto und nicht je Adresse. Darüber ist die Antwort 429, und es ist nichts geschehen: Die Anfrage wurde abgelehnt, nicht ausgeführt. Warte eine Minute und schick sie erneut; ein Programm, das regelmäßig anstößt, sollte langsamer werden statt sofort neu zu fragen.

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

Neben der Grenze des Schlüssels zählen Schreibzugriffe gegen dieselben Grenzen wie in der Anwendung: wie viele Beiträge, Antworten oder Beziehungen in wenigen Minuten. Auch die antworten 429 mit dem Code rate_limited.

Header

Die Namen sind die, die jede Client-Bibliothek schon kennt. Außer dem Schlüssel ist keiner 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, für Werkzeuge, die diesen Header für etwas anderes brauchen.
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, als schwach markiert (W/). Schick ihn als If-None-Match zurück.
X-RateLimit-LimitWie viele Anfragen dieser Schlüssel pro 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 wegen eines fehlenden Schlüssels: Bearer, so wird ein Schlüssel erwartet.
Cache-Controlno-store: Kein Proxy dazwischen darf eine Antwort aufheben, weil sie vom fragenden Schlüssel abhängt. Dein eigenes Programm darf sie trotzdem mit dem ETag prüfen.

Wenn etwas nicht geht

Fehler kommen als JSON mit zwei Feldern: ein fester englischer Code in error, den dein Programm vergleichen kann, und ein Satz in message für den Menschen davor, dazu der Statuscode, der dazu gehört. Der Code bleibt; der Satz darf sich ändern, und er darf sich in jeder Sprache ändern. Ein Programm, das den Satz vergleicht, geht an einem Tag kaputt, den niemand angekündigt hat.

{ "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 gehört nicht zu den erlaubten. message sagt, was.
401key_missingKein Schlüssel im Header.
401key_invalidDer Schlüssel gilt nicht: vertippt, durch einen neuen ersetzt, oder sein Konto ist gesperrt. Was davon, wird bewusst nicht gesagt.
401unauthorizedAls nicht angemeldet abgewiesen, aus einem anderen Grund als dem Schlüssel. Selten, und ein Anlass, das Konto hinter dem Schlüssel anzusehen.
403scope_missingDem Schlüssel fehlt das Recht, das dieser Pfad braucht: meist write bei einem Schlüssel, der nur lesen darf.
403account_data_lockedDas betrifft deine Kontodaten, an die kein Schlüssel kommt: Passwort, E-Mail-Adresse, Löschung und Ähnliches.
403forbiddenDein Konto darf das nicht: dieselbe Ablehnung wie in der Anwendung, zum Beispiel ein entzogenes Recht oder eine Blockierung.
404unknown_pathDiesen Pfad gibt es nicht, oder nicht mit dieser Methode.
404not_foundDen Pfad gibt es, aber nicht das, was er nennt, oder du darfst es nicht sehen. Beides wird nicht unterschieden.
409conflictEs kollidiert mit etwas, das schon da ist, zum Beispiel ein vergebener Name.
413too_largeZu groß: ein Text oder eine Anfrage jenseits dessen, was diese Instanz annimmt.
422unprocessableLesbar, aber in dieser Form nicht möglich.
429rate_limitedZu viele Anfragen. Es ist nichts passiert; warte und schick sie noch einmal.
500internal_errorBei uns ist etwas schiefgegangen, nicht bei dir. Es steht vollständig im Protokoll des Servers.

Versionen

Die Fassung steht im Pfad. Solange dort v2 steht, bleiben diese Wege und ihre Felder, wie sie sind; was dazukommt, kommt daneben.

Ergänzungen erhöhen die zweite Zahl: 2.1 brachte /emojis und das Gelesen-Markieren einer Unterhaltung. 2.4 hat das Feld contentWarning wieder entfernt, weil es keine Inhaltswarnungen mehr gibt. 2.5 hat das Feld alt an Bildern entfernt, weil es keine Bildbeschreibungen mehr gibt. 2.6 bringt die Mitteilungsart team für neue Aufgaben des Teams. Jeder Pfad sagt, seit welcher Version es ihn gibt, und die Wurzel sagt, welche Version läuft.

Endpunkte

Alle Pfade auf einen Blick, danach jeder einzeln: was er nimmt, eine Beispielanfrage und was zurückkommt.

WegRechtWozu
Der Einstieg
GET/api/v2readDer Eingang: welche Fassung diese API spricht und wie diese Instanz heißt.
Beiträge
GET/api/v2/postsreadDie öffentlichen Beiträge, neueste zuerst.
GET/api/v2/posts/{id}readEin einzelner Beitrag, über seine id.
POST/api/v2/postswriteEinen Beitrag veröffentlichen.
DELETE/api/v2/posts/{id}writeEinen eigenen Beitrag entfernen.
Antworten
GET/api/v2/posts/{id}/repliesreadDie Antworten auf einen Beitrag, so wie du sie siehst. Was ein geblocktes Konto geschrieben hat, bleibt draußen.
POST/api/v2/posts/{id}/replieswriteAuf einen Beitrag antworten.
Umfragen
POST/api/v2/posts/{id}/votewriteAn einer Umfrage teilnehmen.
Profile
GET/api/v2/profiles/{handle}readEin Profil, über sein Kürzel.
GET/api/v2/profiles/{handle}/postsreadDie öffentlichen Beiträge eines Profils, neueste zuerst.
Communities
GET/api/v2/communitiesreadDie offenen Communities dieser Instanz.
GET/api/v2/communities/{id}readEine einzelne Community, über ihre id.
GET/api/v2/communities/{id}/postsreadDie öffentlichen Beiträge aus einer Community, neueste zuerst.
Entdecken
GET/api/v2/tagsreadDie Tags, die gerade laufen.
GET/api/v2/searchreadEine Suche über Beiträge, Namen, Kürzel und Tags.
GET/api/v2/emojisreadDie eigenen Emojis der Instanz, mit der Adresse ihrer Bilder.
Dein Konto
GET/api/v2/mereadDein eigenes Profil, mit der id, die die anderen Wege erwarten.
GET/api/v2/feedreadDein eigener Feed, so wie die Anwendung ihn zusammenstellt.
Mitteilungen
GET/api/v2/notificationsreadDeine eigenen Mitteilungen, neueste zuerst, blätterbar, damit ein Programm nachholen kann, was es verpasst hat.
POST/api/v2/notifications/readwriteDeine Mitteilungen als gelesen markieren.
Nachrichten
GET/api/v2/conversationsreadDein Postfach: eine Zeile je Gespräch, das jüngste zuerst.
GET/api/v2/conversations/{with}/messagesreadDie Nachrichten eines Gesprächs, neueste zuerst.
POST/api/v2/conversations/{with}/messageswriteEine Nachricht in einem Gespräch senden.
POST/api/v2/conversations/{with}/readwriteAlle Nachrichten einer Unterhaltung als gelesen markieren.
Beziehungen
POST/api/v2/relationswriteMögen, merken, teilen, folgen, beitreten, blockieren, stummschalten, je nach kind.

Der Einstieg

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

GET/api/v2

Der Eingang: welche Fassung diese API spricht und wie diese Instanz heißt.

  • Recht read
  • mit ETag
  • seit v2.0

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

Beispielanfrage

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

Antwort

Antwortet mit einem Service.

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

Mögliche Status: 200304401429

Beiträge

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

GET/api/v2/posts

Die öffentlichen Beiträge, neueste zuerst.

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

Auf den öffentlichen Pfaden werden Reaktionen nicht gezählt: counts.likes und counts.reposts sind 0 und pinned ist false (ein Ausschnitt, keine Messung).

Beiträge in einer Community erreichst du hier nicht, weder in der Liste noch über ihre id. Sie stehen unter /communities/{id}/posts.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Mögliche Status: 200304401429

GET/api/v2/posts/{id}

Ein einzelner Beitrag, über seine id.

  • Recht read
  • mit ETag
  • seit v2.0

Auf den öffentlichen Pfaden werden Reaktionen nicht gezählt: counts.likes und counts.reposts sind 0 und pinned ist false (ein Ausschnitt, keine Messung).

Beiträge in einer Community erreichst du hier nicht, weder in der Liste noch über ihre id. Sie stehen unter /communities/{id}/posts.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.

Beispielanfrage

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

Mögliche Status: 200304400401404429

POST/api/v2/posts

Einen Beitrag veröffentlichen.

  • Recht write
  • seit v2.0

Ein Beitrag braucht Text oder eine Umfrage. Seine Länge, die Zahl der Antworten einer Umfrage und wie viele Beiträge in welcher Zeit legt diese Instanz fest; darüber lautet die Antwort 400 oder 429, mit einer message, die sagt, was.

Bilder lassen sich über die API noch nicht anhängen, nur in der Anwendung.

Parameter

NameTypBedeutung
textim KörperstringfreiwilligDer Text selbst: des Beitrags, der Antwort oder der Nachricht.
communityim KörperstringfreiwilligDie id der Community, in die der Beitrag geht. Ohne sie steht er außerhalb jeder Community.
quotesim KörperstringfreiwilligDie id des Beitrags, den dieser zitiert.
pollim Körperstring[]freiwilligDie Antwortmöglichkeiten einer Umfrage, als Liste von Texten. Wie viele erlaubt sind, setzt die Instanz.

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

Antwort

Antwortet mit einem Created.

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

Mögliche Status: 200400401403429

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Antworten

Das Gespräch unter einem Beitrag: gelesen als Liste, die parentId zum Baum macht, geschrieben als Antwort auf den Beitrag oder auf eine Antwort.

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

Die Antworten auf einen Beitrag, so wie du sie siehst. Was ein geblocktes Konto geschrieben hat, bleibt draußen.

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

Die Liste ist flach und in der Reihenfolge des Schreibens; parentId macht einen Baum daraus. Eine Seite hält ganze Stränge, eine Antwort kommt also nie ohne die, auf die sie antwortet. Was ein Konto schrieb, das du blockiert hast oder das dich blockiert hat, bleibt draußen. Zwei Schlüssel können verschiedene Listen sehen.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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,
      "createdAt": 1758624600000,
      "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
      "parentId": null
    }
  ],
  "next": "MTc1ODYyNDAwMDAwMDo1ZjBjMmE5ZS04ZDQx"
}

Mögliche Status: 200304400401404429

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

Auf einen Beitrag antworten.

  • Recht write
  • seit v2.0

Steht der Beitrag im langsamen Modus, ist eine Antwort pro Person alle 10 Minuten möglich; eine weitere ergibt 429 mit der Wartezeit in der Meldung. Der Modus gilt nicht für den Verfasser und die Konten, denen er folgt.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
textim KörperstringPflichtDer Text selbst: des Beitrags, der Antwort oder der Nachricht.
parentIdim KörperstringfreiwilligDie id der Antwort, auf die diese antwortet. Ohne sie direkt an den Beitrag.

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://tellmelo.com/api/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

Umfragen

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

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

An einer Umfrage teilnehmen.

  • Recht write
  • seit v2.0

Die Stimmen je Antwort sind null, solange das Ergebnis zurückgehalten wird: vor deiner eigenen Stimme, während die Umfrage läuft. total ist immer da.

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id eines Beitrags.
optionim KörperintegerPflichtWelche Antwort, ab 0 gezählt. Eine je Aufruf. Eine Umfrage mit mehreren Antworten wird durch mehrfaches Aufrufen gewählt.
retractim KörperbooleanfreiwilligOb diese Stimme zurückgenommen wird: true macht sie rückgängig.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Profile

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

GET/api/v2/profiles/{handle}

Ein Profil, über sein Kürzel.

  • Recht read
  • mit ETag
  • seit v2.0

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils.

Beispielanfrage

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

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

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

Auf den öffentlichen Pfaden werden Reaktionen nicht gezählt: counts.likes und counts.reposts sind 0 und pinned ist false (ein Ausschnitt, keine Messung).

Beiträge in einer Community erreichst du hier nicht, weder in der Liste noch über ihre id. Sie stehen unter /communities/{id}/posts.

Parameter

NameTypBedeutung
handleim PfadstringPflichtDas Kürzel eines Profils.
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Mögliche Status: 200304400401404429

Communities

Die offenen Communities dieser Instanz und ihre Beiträge. Interne und verborgene sind mit einem Schlüssel nicht erreichbar.

GET/api/v2/communities

Die offenen Communities dieser Instanz.

  • Recht read
  • mit ETag
  • seit v2.0

Sortiert nach der Zahl der Mitglieder, nicht nach der Zeit, deshalb wird diese Liste nicht geblättert, und next ist immer null.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.

Beispielanfrage

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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",
      "description": "Balconies, allotments, rooftops: whatever grows.",
      "tags": [
        "garden",
        "bees"
      ],
      "members": 312,
      "joinPolicy": "open",
      "visibility": "open"
    }
  ],
  "next": null
}

Mögliche Status: 200304401429

GET/api/v2/communities/{id}

Eine einzelne Community, über ihre id.

  • Recht read
  • mit ETag
  • seit v2.0

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Community.

Beispielanfrage

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

Antwort

Antwortet mit einem Community.

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

Mögliche Status: 200304400401404429

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

Die öffentlichen Beiträge aus einer Community, neueste zuerst.

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

Auf den öffentlichen Pfaden werden Reaktionen nicht gezählt: counts.likes und counts.reposts sind 0 und pinned ist false (ein Ausschnitt, keine Messung).

Parameter

NameTypBedeutung
idim PfadstringPflichtDie id einer Community.
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Mögliche Status: 200304400401404429

Entdecken

Worüber gerade gesprochen wird, eine Suche über Beiträge, Profile und Tags, und die eigenen Emojis der Instanz.

GET/api/v2/tags

Die Tags, die gerade laufen.

  • Recht read
  • mit ETag
  • seit v2.0

Die Tags, die gerade laufen, die meisten Beiträge zuerst. Nicht blätterbar: limit kürzt nur die Liste.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.

Beispielanfrage

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

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

  • Recht read
  • mit ETag
  • seit v2.0

Sucht nur im Öffentlichen: Beiträge außerhalb von Communities, Profile und Tags. limit zählt je Art: 20 kann bis zu 20 Beiträge, 20 Profile und 20 Tags bringen.

Parameter

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

Beispielanfrage

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

Mögliche Status: 200304400401429

GET/api/v2/emojis

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

  • Recht read
  • mit ETag
  • seit v2.1

In Texten steht ein Emoji dieser Instanz als :name:. Ersetz es durch das Bild aus dieser Liste; ein Name, der nicht darin steht, bleibt Text. Er wurde gelöscht oder hat nie existiert.

Beispielanfrage

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

Dein Konto

Dein eigenes Profil und dein Feed, so zusammengestellt, wie die Anwendung es für dich tut.

GET/api/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://tellmelo.com/api/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/api/v2/feed

Dein eigener Feed, so wie die Anwendung ihn zusammenstellt.

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

Hier gibt es kein ETag: Die Reihenfolge bewegt sich mit der Zeit, jede Antwort ist also anders. Eine begonnene Liste bleibt trotzdem bis zu ihrem Ende gleich: next trägt den Moment, in dem sie begann.

Parameter

NameTypBedeutung
tabin der AdressestringfreiwilligWelcher Feed: for-you, following, latest oder bookmarks. latest als Vorgabe.for-youfollowinglatestbookmarks
tagin der AdressestringfreiwilligNur Beiträge mit diesem Tag. Ohne ihn kein Filter.
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Mögliche Status: 200400401429

Mitteilungen

Was rund um dein Konto passiert ist, seitenweise lesbar, damit ein Programm nachholen kann, was es verpasst hat.

GET/api/v2/notifications

Deine eigenen Mitteilungen, neueste zuerst, blätterbar, damit ein Programm nachholen kann, was es verpasst hat.

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

Lesen markiert nichts als gelesen; das tut POST /notifications/read. Mehrere Ereignisse derselben Art zum selben Beitrag werden in einer Zeile gesammelt, und more sagt, wie viele.

Parameter

NameTypBedeutung
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Deine Mitteilungen als gelesen markieren.

  • Recht write
  • seit v2.0

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200401403429

Nachrichten

Dein Postfach und deine Unterhaltungen. Eine Unterhaltung hat keine eigene ID; sie heißt nach dem anderen Konto.

GET/api/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 AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

curl \
  -H "Authorization: Bearer tm_key_…" \
  "https://tellmelo.com/api/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/api/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. Ein Programm, das im Hintergrund abruft, hat niemandem etwas gezeigt. Das tut POST /conversations/{with}/read.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des Kontos, mit dem du sprichst. Ein Gespräch hat keine eigene id. Es ist das andere Konto, derselbe Wert, den das Postfach with nennt.
limitin der AdresseintegerfreiwilligWie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der AdressestringfreiwilligWo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.

Beispielanfrage

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

Eine Nachricht in einem Gespräch senden.

  • Recht write
  • seit v2.0

Es gelten dieselben Regeln wie in der Anwendung: Wer dich blockiert hat, ist nicht erreichbar, und die Einstellungen der anderen Person zählen. Die Antwort sagt dann, warum.

Bilder lassen sich über die API noch nicht anhängen, nur in der Anwendung.

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des Kontos, mit dem du sprichst. Ein Gespräch hat keine eigene id. Es ist das andere Konto, derselbe Wert, den das Postfach with nennt.
textim KörperstringPflichtDer Text selbst: 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://tellmelo.com/api/v2/conversations/a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05/messages"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

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

Alle Nachrichten einer Unterhaltung als gelesen markieren.

  • Recht write
  • seit v2.1

Parameter

NameTypBedeutung
withim PfadstringPflichtDie id des Kontos, mit dem du sprichst. Ein Gespräch hat keine eigene id. Es ist das andere Konto, derselbe Wert, den das Postfach with nennt.

Beispielanfrage

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

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403404429

Beziehungen

Gefällt mir, merken, teilen, folgen, beitreten und blockieren: ein Pfad für alles, gesetzt und zurückgenommen mit active.

POST/api/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 Community, bei follow, block und mute ein Konto, immer über seine id. active: false nimmt die Beziehung zurück. Über eine Blockierung hinweg folgt niemand, in keine Richtung. Stummschalten sieht nur, wer es setzt.

Parameter

NameTypBedeutung
kindim KörperstringPflichtWelche Beziehung: like, save, repost, follow, join, block oder mute (seit 2.2).likesaverepostfollowjoinblockmute
targetim KörperstringPflichtWorauf die Beziehung zeigt, über dessen id: ein Beitrag, ein Profil oder eine Community, je nach kind.
activeim KörperbooleanfreiwilligOb die Beziehung bestehen soll: true setzt sie, 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://tellmelo.com/api/v2/relations"

Antwort

Antwortet mit einem Ok.

Beispiel
{
  "ok": true
}

Mögliche Status: 200400401403429

Objekte

Alles, was in einer Antwort stehen kann, Feld für Feld. Jedes Feld ist immer vorhanden; die Typen sind JSON-Typen, und [] 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.6",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/legal/api",
  "spec": "/api/v2/openapi.json"
}

RateLimit

Das Kontingent dieses Schlüssels in der laufenden Minute.

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

Post

Ein Beitrag: überall dieselbe Form, ob öffentlich, aus deinem Feed oder aus einer Suche.

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 Community, in der er geschrieben wurde (null außerhalb jeder Community).
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.
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"
    }
  ],
  "poll": {
    "options": [
      {
        "text": "Lavender",
        "votes": 12
      },
      {
        "text": "Sunflowers",
        "votes": 7
      },
      {
        "text": "Clover",
        "votes": 3
      }
    ],
    "total": 22,
    "multiple": false,
    "endsAt": 1758710400000,
    "running": true,
    "resultsVisible": true,
    "myVotes": [
      0
    ]
  },
  "quotes": null,
  "continues": null,
  "counts": {
    "replies": 4,
    "likes": 31,
    "reposts": 2
  },
  "pinned": false,
  "createdAt": 1758624000000
}

Reply

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,
  "createdAt": 1758624600000,
  "postId": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "parentId": null
}

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, relativ zu dieser Instanz. Lad es mit dem Schlüssel im Header.
Beispiel
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918"
}

Poll

Die Umfrage eines Beitrags.

FeldTypBedeutung
optionsPollOption[]Die Antworten, in Reihenfolge. option beim Abstimmen zählt ab 0.
totalintegerWie viele Stimmen es insgesamt gibt: immer, auch während die Verteilung zurückgehalten wird.
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": 1758710400000,
  "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 @. Er ist Teil der Profiladresse und kann keine Emojis enthalten.
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.
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 mit rel=me auf dieses Profil zurückverlinkt, zuletzt geprüft innerhalb einer Woche. Seit 2.3.
followersintegerWie viele Konten ihm folgen.
createdAtintegerWann das Konto angelegt wurde.
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 Community, in der ein Beitrag geschrieben wurde.

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

Community

Eine Community dieser Instanz.

FeldTypBedeutung
idstringDie ID der Community.
namestringIhr Name.
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 Community annimmt.
  • invite — Nur auf Einladung.
visibilitystringWer sie sehen kann. Über einen Schlüssel immer open. Die anderen sind nicht erreichbar.
  • open — Für alle sichtbar.
Beispiel
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "description": "Balconies, allotments, rooftops: whatever grows.",
  "tags": [
    "garden",
    "bees"
  ],
  "members": 312,
  "joinPolicy": "open",
  "visibility": "open"
}

Tag

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

Was eine Suche findet: drei Listen, jede womöglich leer, nie fehlend.

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

Emoji

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.
  • 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.
  • message — Jemand hat dir eine Nachricht geschrieben.
  • scheduled — Ein geplanter Beitrag von dir ist erschienen.
  • 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 Einspruch.
  • team — Neue Arbeit fürs Team, nur für Inhaber, Admins und Moderatoren: Meldungen, Widersprüche, eingereichte Links, Anliegen, Anträge auf Verifizierung und Kündigungen.
textstringoder nullNur bei Meldungen und Moderation: der Text, der dazugehört. Sonst null. Den Satz zu einer Mitteilung baut dein Programm.
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 einer Unterhaltung.

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
}

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
}

Ok

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

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

Die maschinenlesbare Beschreibung

Dieselbe Tabelle, aus der diese Seite gebaut ist, liegt unter /api/v2/openapi.json: Wege, Parameter, Rechte und die Gestalten, die zurückkommen. Ein Erzeuger für Clients kann sie lesen, und sie kann nicht von der API abdriften, denn die Seite, der Verteiler und die Beschreibung kommen aus einer Liste.

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

Was aus v1 geworden ist

v1 ist entfernt. Die alten Wege unter /api/v1/ antworten 410 und sagen im Rumpf, wohin es weitergeht. Keine Weiterleitung, denn v2 antwortet in einer anderen Gestalt, und ein Programm, das ihr folgte, bekäme ein 200, das es nicht lesen kann. Es gab zu diesem Zeitpunkt noch keine öffentlichen Konten und damit niemanden mit einem Programm darauf; später zu entfernen hätte geheissen, es nie zu tun.

Was wir erwarten

Dieselben Grundsätze wie überall sonst: keine Belästigung, kein Spam, keine fremden Inhalte ohne Recht daran. Ein Programm entschuldigt nichts. Für das, was dein Schlüssel schreibt, stehst du gerade.

Zurück zu tellmelo