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
Leg unter „Einstellungen → App & Daten → API“ einen Schlüssel an und kopier ihn. Er wird nur ein einziges Mal gezeigt.
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.
Ab da funktioniert jeder Pfad gleich: der Schlüssel im Header, JSON zurück, und bei Listen items und next.
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.
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.
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.
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.
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.
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
Header
Bedeutung
Authorization
Trägt den Schlüssel: Bearer tm_key_…. Der übliche Weg.
X-Tellmelo-Key
Der Schlüssel, als Alternative zu Authorization, für Werkzeuge, die diesen Header für etwas anderes brauchen.
Content-Type
application/json, für eine Anfrage mit Körper.
If-None-Match
Das ETag der letzten Antwort. Hat sich seitdem nichts geändert, lautet die Antwort 304 ohne Körper.
Was zurückkommt
Header
Bedeutung
ETag
Der Fingerabdruck dieser Antwort, als schwach markiert (W/). Schick ihn als If-None-Match zurück.
X-RateLimit-Limit
Wie viele Anfragen dieser Schlüssel pro Minute stellen darf.
X-RateLimit-Remaining
Wie viele davon in der laufenden Minute übrig sind.
X-RateLimit-Reset
Wann die nächste Minute beginnt, in Sekunden seit 1970, UTC.
X-Tellmelo-Scope
Was dieser Schlüssel darf: read oder read write.
Retry-After
Bei 429: wie viele Sekunden du warten solltest, bevor du wieder fragst.
WWW-Authenticate
Bei 401 wegen eines fehlenden Schlüssels: Bearer, so wird ein Schlüssel erwartet.
Cache-Control
no-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.
Status
Code
Bedeutung
400
bad_request
Die Anfrage ist nicht lesbar, ein Pflichtfeld fehlt, oder ein Wert gehört nicht zu den erlaubten. message sagt, was.
401
key_missing
Kein Schlüssel im Header.
401
key_invalid
Der Schlüssel gilt nicht: vertippt, durch einen neuen ersetzt, oder sein Konto ist gesperrt. Was davon, wird bewusst nicht gesagt.
401
unauthorized
Als nicht angemeldet abgewiesen, aus einem anderen Grund als dem Schlüssel. Selten, und ein Anlass, das Konto hinter dem Schlüssel anzusehen.
403
scope_missing
Dem Schlüssel fehlt das Recht, das dieser Pfad braucht: meist write bei einem Schlüssel, der nur lesen darf.
403
account_data_locked
Das betrifft deine Kontodaten, an die kein Schlüssel kommt: Passwort, E-Mail-Adresse, Löschung und Ähnliches.
403
forbidden
Dein Konto darf das nicht: dieselbe Ablehnung wie in der Anwendung, zum Beispiel ein entzogenes Recht oder eine Blockierung.
404
unknown_path
Diesen Pfad gibt es nicht, oder nicht mit dieser Methode.
404
not_found
Den Pfad gibt es, aber nicht das, was er nennt, oder du darfst es nicht sehen. Beides wird nicht unterschieden.
409
conflict
Es kollidiert mit etwas, das schon da ist, zum Beispiel ein vergebener Name.
413
too_large
Zu groß: ein Text oder eine Anfrage jenseits dessen, was diese Instanz annimmt.
422
unprocessable
Lesbar, aber in dieser Form nicht möglich.
429
rate_limited
Zu viele Anfragen. Es ist nichts passiert; warte und schick sie noch einmal.
500
internal_error
Bei 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.
Ö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
Name
Typ
Bedeutung
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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.
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
Name
Typ
Bedeutung
textim Körper
stringfreiwillig
Der Text selbst: des Beitrags, der Antwort oder der Nachricht.
communityim Körper
stringfreiwillig
Die id der Community, in die der Beitrag geht. Ohne sie steht er außerhalb jeder Community.
quotesim Körper
stringfreiwillig
Die id des Beitrags, den dieser zitiert.
pollim Körper
string[]freiwillig
Die 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"
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
Name
Typ
Bedeutung
idim Pfad
stringPflicht
Die id eines Beitrags.
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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
Name
Typ
Bedeutung
idim Pfad
stringPflicht
Die id eines Beitrags.
textim Körper
stringPflicht
Der Text selbst: des Beitrags, der Antwort oder der Nachricht.
parentIdim Körper
stringfreiwillig
Die 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"
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
Name
Typ
Bedeutung
handleim Pfad
stringPflicht
Das Kürzel eines Profils.
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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
Name
Typ
Bedeutung
idim Pfad
stringPflicht
Die id einer Community.
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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
Name
Typ
Bedeutung
qin der Adresse
stringPflicht
Die Wörter, nach denen gesucht wird.
typein der Adresse
stringfreiwillig
Welche Art von Treffer. Ohne ihn jede Art.allpostsprofilestags
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
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.
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
Name
Typ
Bedeutung
tabin der Adresse
stringfreiwillig
Welcher Feed: for-you, following, latest oder bookmarks. latest als Vorgabe.for-youfollowinglatestbookmarks
tagin der Adresse
stringfreiwillig
Nur Beiträge mit diesem Tag. Ohne ihn kein Filter.
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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
Name
Typ
Bedeutung
limitin der Adresse
integerfreiwillig
Wie viele Einträge eine Seite hält: 20 als Vorgabe, höchstens 50.
cursorin der Adresse
stringfreiwillig
Wo es weitergeht: das next der vorigen Antwort. Ohne ihn von oben.
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
Name
Typ
Bedeutung
withim Pfad
stringPflicht
Die 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örper
stringPflicht
Der Text selbst: des Beitrags, der Antwort oder der Nachricht.
replyToim Körper
stringfreiwillig
Die 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"
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
Name
Typ
Bedeutung
kindim Körper
stringPflicht
Welche Beziehung: like, save, repost, follow, join, block oder mute (seit 2.2).likesaverepostfollowjoinblockmute
targetim Körper
stringPflicht
Worauf die Beziehung zeigt, über dessen id: ein Beitrag, ein Profil oder eine Community, je nach kind.
activeim Körper
booleanfreiwillig
Ob die Beziehung bestehen soll: true setzt sie, false nimmt sie zurück.
Eine Mitteilung. Eine Zeile kann mehrere Ereignisse derselben Art sammeln.
Feld
Typ
Bedeutung
id
string
Die ID der Mitteilung.
kind
string
Was 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.
text
stringoder null
Nur bei Meldungen und Moderation: der Text, der dazugehört. Sonst null. Den Satz zu einer Mitteilung baut dein Programm.
Die id der Nachricht, auf die diese antwortet (null, wenn sie auf keine antwortet). Seit 2.2.
createdAt
integer
Wann 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.
Feld
Typ
Bedeutung
id
string
Die ID dessen, was angelegt wurde.
scheduledFor
integeroder null
Wann es erscheint, wenn die Veröffentlichung geplant wurde (sonst null).
deleteAt
integeroder null
Wann es sich selbst löscht, wenn das eingestellt wurde (sonst null).
Die Antwort eines Schreibzugriffs, der nichts zurückzugeben hat.
Feld
Typ
Bedeutung
ok
boolean
Immer 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.