tellmelo.DéveloppeursAller sur tellmelo
Centre d’aideAssistanceMentions légalesDéveloppeurs

API

Pour commencer

  • Je veux …
  • Vue d’ensemble
  • Démarrage rapide
  • Essayer
  • Ta clé
  • Ce qu’une clé a le droit de faire
  • Bots

Principes

  • Requêtes et réponses
  • Pages
  • Seulement ce qui est nouveau
  • Limites
  • En-têtes
  • Quand quelque chose ne marche pas
  • Versions

Points d’accès

  • Points d’accès
  • L’entrée
    • GET /
  • Publications
    • 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
  • Réponses
    • 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}
  • Sondages
    • POST /posts/{id}/vote
  • Profils
    • 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
  • Groupes
    • 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
  • Salons
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gérer des groupes
    • 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
  • Découvrir
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF et vidéos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Ton compte
    • GET /me
    • GET /feed
    • POST /me/pictures
    • PUT /me/profile
    • GET /me/emojis
    • POST /me/emojis/pictures
    • POST /me/emojis
    • DELETE /me/emojis/{name}
    • PUT /me/emojis/sharing
    • GET /me/webhooks
    • POST /me/webhooks
    • DELETE /me/webhooks/{id}
    • POST /me/webhooks/{id}/test
  • Notifications
    • GET /notifications
    • POST /notifications/read
  • Messages
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
    • DELETE /conversations/{with}/messages/{id}
    • POST /conversations/{with}/planned
    • GET /me/planned-messages
    • POST /me/planned-messages/{id}/send
    • DELETE /me/planned-messages/{id}
  • Relations
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Collections
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Cadeaux
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objets

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

Plus

  • La description lisible par une machine
  • GIF et vidéos sur d’autres sites web
  • Se connecter avec tellmelo
  • Ce que nous attendons
Sommaire

Pour commencer

  • Je veux …
  • Vue d’ensemble
  • Démarrage rapide
  • Essayer
  • Ta clé
  • Ce qu’une clé a le droit de faire
  • Bots

Principes

  • Requêtes et réponses
  • Pages
  • Seulement ce qui est nouveau
  • Limites
  • En-têtes
  • Quand quelque chose ne marche pas
  • Versions

Points d’accès

  • Points d’accès
  • L’entrée
    • GET /
  • Publications
    • 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
  • Réponses
    • 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}
  • Sondages
    • POST /posts/{id}/vote
  • Profils
    • 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
  • Groupes
    • 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
  • Salons
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gérer des groupes
    • 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
  • Découvrir
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF et vidéos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Ton compte
    • GET /me
    • GET /feed
    • POST /me/pictures
    • PUT /me/profile
    • GET /me/emojis
    • POST /me/emojis/pictures
    • POST /me/emojis
    • DELETE /me/emojis/{name}
    • PUT /me/emojis/sharing
    • GET /me/webhooks
    • POST /me/webhooks
    • DELETE /me/webhooks/{id}
    • POST /me/webhooks/{id}/test
  • Notifications
    • GET /notifications
    • POST /notifications/read
  • Messages
    • GET /conversations
    • GET /conversations/{with}/messages
    • POST /conversations/{with}/messages
    • POST /conversations/{with}/read
    • DELETE /conversations/{with}/messages/{id}
    • POST /conversations/{with}/planned
    • GET /me/planned-messages
    • POST /me/planned-messages/{id}/send
    • DELETE /me/planned-messages/{id}
  • Relations
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Collections
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Cadeaux
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objets

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

Plus

  • La description lisible par une machine
  • GIF et vidéos sur d’autres sites web
  • Se connecter avec tellmelo
  • Ce que nous attendons

Je veux …

Choisis ce que tu prévois ; en dessous figurent seulement les étapes pour cela. La référence complète suit plus bas.

  1. Crée le bot dans l’un de tes groupes, dans le menu du groupe sous « Bots → Mes bots », avec image, nom et @nom. Tu ne vois son jeton qu’une fois.
  2. Partage son lien « Ajouter le bot » ou soumets-le à l’annuaire des bots, où il figure après la vérification de l’équipe ; quiconque peut gérer les rôles d’un groupe l’accueille avec les droits qu’il accepte.
  3. Reçois ce qui se passe dans ses groupes en flux (GET /v2/events/stream) ou à ton adresse, et écris avec POST /v2/channels/{id}/messages. Plus sous Bots.
  4. Déclare des commandes (PUT /v2/me/commands) et réponds avec des cartes et des boutons ; un bot joue de la musique avec une place dans un salon vocal (POST /v2/channels/{id}/voice).

Vue d’ensemble

Avec v2, tes propres programmes parlent à tellmelo : une clé par requête, du JSON en retour, toutes les listes se paginent de la même façon. Les mêmes règles que dans l’app s’appliquent.

  • Chaque chemin commence par https://api.tellmelo.com/v2.
  • Requêtes et réponses sont en JSON, en UTF-8. Les noms de champs, les codes et les valeurs sont en anglais et le restent.
  • Une clé agit comme ton compte : ce que tu ne vois pas dans l’app, elle ne peut pas le lire non plus.
https://api.tellmelo.com/v2

Démarrage rapide

  1. Crée une clé sous « Espace développeurs → API » et copie-la. Elle n’est montrée qu’une seule fois.
  2. Interroge la racine avec elle. La réponse indique la version, les droits de la clé et les requêtes restantes pour cette minute.
  3. Tous les chemins fonctionnent pareil : clé dans l’en-tête, JSON en retour, items et next pour les listes.
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"
}

Ensuite : /me pour ton profil, /posts pour le public, /feed pour ton fil.

Essayer

Choisis une tâche, remplis les champs et copie la requête ou envoie-la d’ici. Écrire demande confirmation. Le code lit la clé dans TELLMELO_KEY.

read Version de l’API et nom de cette instance.

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

Ta clé

Jusqu’à 10 clés par compte, chacune avec un nom, ses propres droits et, si tu veux, une date d’expiration. Une clé commence par tm_key_ et n’est affichée qu’une fois. Perdue ? Renouvelle-la ; l’ancienne valeur ne fonctionne plus.

Tu la crées sous « Espace développeurs → API ». Elle voyage dans l’en-tête de la requête :

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

Ou, si c’est plus commode, dans un en-tête à part :

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

Pas dans l’URL : elle finirait dans les journaux et l’historique du navigateur.

La même clé charge les images : chaque url pointe vers /api/media ; envoie aussi la clé dans l’en-tête.

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

Ce qu’une clé a le droit de faire

Une clé peut toujours lire et, si tu l’autorises, aussi écrire, offrir, importer des médias et gérer des groupes. Chaque chemin ci-dessous indique ce dont il a besoin :

  • read : lire. Publications publiques, profils, groupes et tags, plus ton fil, tes notifications, tes messages et les salons de tes groupes.
  • write : agir. Publier, répondre, voter, envoyer des messages, écrire dans la discussion d’un groupe, suivre, rejoindre, bloquer, marquer les notifications comme lues.
  • gifts : offrir. Depuis le contingent d’un partenaire à un membre, et des cadeaux sous une nouvelle publication. Un droit à part, pour qu’une clé faite pour publier ne puisse jamais rien offrir.
  • media : ta propre médiathèque. Importer, modifier, partager et supprimer des GIF et des vidéos. Une autorisation à part, car les imports coûtent des points vidéo au compte. Trouver des GIF et vidéos partagés ne demande que read.
  • groups : gérer des groupes. Rôles, salons, catégories, liens d’invitation, le salon du fil, les retraits, exclusions temporaires, expulsions et bannissements, dans la mesure où ton compte en a le droit dans le groupe. Un droit à part, pour qu’une clé servant à publier ne change jamais qui peut faire quoi dans un groupe.

Ce qu’aucune clé ne peut

Aucune clé n’atteint le mot de passe, l’adresse e-mail, le type de compte, le lieu, le rôle, la suppression, les connexions, les appareils de notification ou d’autres clés, ni l’administration ou l’animation de groupes. Ce que protège le mot de passe, aucune clé ne le peut.

Bots

Un bot est un compte à part entière, du type bot, pour les groupes : sans mot de passe ni adresse e-mail, piloté par ton programme avec sa propre clé. Il utilise la même API que tout compte et peut faire dans les groupes ce que son rôle y permet.

  1. Dans l’un de tes groupes, ouvre le menu du groupe et, sous « Bots → Mes bots », crée un bot avec image, bannière, nom, nom d’utilisateur et description. Le jeton n’est affiché qu’une fois ; il a les droits read, write, media et groups.
  2. Partage le lien du bot ou soumets-le à l’annuaire des bots ; il y figure dès que l’équipe l’a vérifié. Quiconque peut gérer les rôles d’un groupe choisit les droits ; le bot rejoint le groupe et reçoit son propre rôle.
  3. Ton programme envoie le jeton comme Authorization: Bearer …, lit les événements de ses groupes en flux et travaille avec les routes sous Bots, Salons et Groupes.

Un petit bot qui lit les événements en flux et répond à la commande /ping par pong, seulement pour qui a demandé :

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

Le même bot en Python, qui récupère les événements page par page :

# Python 3 with requests: the same bot, reading the events page by page.
import os, time, requests

BASE = 'https://api.tellmelo.com/v2'
H = {'Authorization': 'Bearer ' + os.environ['TELLMELO_BOT_TOKEN']}
requests.put(BASE + '/me/commands', headers=H,
             json={'commands': [{'name': 'ping', 'description': 'Answers pong'}]})

since = '0'
while True:
    page = requests.get(BASE + '/events', headers=H, params={'since': since}).json()
    for event in page['items']:
        if event['type'] == 'command' and event['data']['command'] == 'ping':
            requests.post(f"{BASE}/interactions/{event['data']['interaction']}/reply",
                          headers=H, json={'text': 'pong'})
    since = page['next'] or since
    time.sleep(2)
  • Ce qu’un bot peut faire dans un groupe dépend de son rôle là-bas, pas du jeton. Le rôle porte son nom ; le groupe modifie ses droits dans les rôles des réglages du groupe et retire le bot dans le menu du groupe, sous « Bots → Dans ce groupe ».
  • Jusqu’à 5 bots par compte ; par groupe autant que ses avantages le permettent. Un bot écrit au plus 30 messages par minute et par groupe, n’est pas trouvable par la recherche et n’écrit qu’aux personnes qui lui ont écrit d’abord. Les limites s’appliquent.
  • Les événements arrivent aussi à ta propre adresse HTTPS (signés comme les webhooks, avec renvois). En plus : commandes (PUT /v2/me/commands) avec réponses pour tous ou seulement pour qui a demandé, cartes et boutons dans les messages, et musique dans les salons vocaux (POST /v2/channels/{id}/voice) : tout sous Bots.

Requêtes et réponses

  • Du JSON partout. Chaque réponse est en application/json, en UTF-8, erreurs comprises. Seules les images arrivent en images.
  • Ce que tu envoies. Un POST porte ses champs en JSON dans le corps. Si un champ figure aussi dans l’URL, le corps l’emporte.
  • Les dates sont des millisecondes depuis le 1er janvier 1970, UTC.
  • Les ID sont des chaînes. Compare-les seulement en entier.
  • Chaque champ est toujours présent. Ce qui manque vaut null ; les listes peuvent être vides.
  • Les textes sont du texte brut, tels qu’écrits. Les #tags, les @noms et les liens restent tels quels, de même que les émojis propres à l’instance, sous la forme :name: ; leurs images sont listées sous /emojis.
  • Les images sont des adresses relatives, /api/media?id=…. Sans la clé dans l’en-tête, tu reçois 401.

Pages

Chaque liste prend limit et cursor et répond par items et next. Renvoie next comme cursor pour la page suivante ; si next est vide, c’est fini. Le curseur est opaque : ne le décompose pas, n’en fabrique pas.

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

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

Sans limit, 20 entrées, 50 au plus. Certaines listes ne se paginent pas ; leur next vaut toujours null.

Seulement ce qui est nouveau

Chaque réponse porte un ETag. Renvoie-le comme If-None-Match la fois suivante : si rien n’a changé, tu reçois 304 sans corps.

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

Exceptions : /feed n’a pas d’ETag car son ordre change sans cesse, et une écriture ne répond jamais 304.

Limites

Une clé peut faire 120 requêtes par minute, 600 avec l’abonnement « Organisation », sauf si l’administration en décide autrement. Au-delà, la réponse est 429 et rien n’a été exécuté. Attends une minute et renvoie la requête.

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

Les écritures comptent aussi dans les limites de l’app, par exemple le nombre de publications en quelques minutes. Là aussi, la réponse est 429 avec rate_limited.

En-têtes

À part la clé, aucun en-tête n’est obligatoire.

Ce que tu envoies

En-têteSignification
AuthorizationPorte la clé : Bearer tm_key_…. La voie habituelle.
X-Tellmelo-KeyLa clé, en alternative à Authorization.
Content-Typeapplication/json, pour une requête avec un corps.
If-None-MatchL’ETag de la dernière réponse. Si rien n’a changé depuis, la réponse est 304, sans corps.

Ce qui revient

En-têteSignification
ETagL’empreinte de cette réponse (W/). Renvoie-la comme If-None-Match.
X-RateLimit-LimitCombien de requêtes cette clé peut faire par minute.
X-RateLimit-RemainingCombien il en reste dans la minute en cours.
X-RateLimit-ResetQuand la minute suivante commence, en secondes depuis 1970, UTC.
X-Tellmelo-ScopeCe que cette clé peut faire : read ou read write.
Retry-AfterAvec un 429 : combien de secondes attendre avant de redemander.
WWW-AuthenticatePour 401 sans clé : Bearer.
Cache-Controlno-store : aucun proxy ne peut mettre une réponse en cache. Tu peux quand même la vérifier avec l’ETag.

Quand quelque chose ne marche pas

Les erreurs arrivent en JSON : un code anglais fixe dans error pour ton programme et une phrase dans message pour les humains, avec le code de statut correspondant. Compare seulement le code ; la phrase peut changer.

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

Certaines erreurs apportent un champ de plus : docs avec un 401 pour une clé absente, limit avec un 429.

StatutCodeSignification
400bad_requestLa requête est illisible, un champ obligatoire manque ou une valeur n’est pas autorisée.
401key_missingPas de clé dans l’en-tête.
401key_invalidLa clé n’est pas valide : mal saisie, remplacée, ou le compte est banni.
401unauthorizedRefusée comme non connectée, pour une autre raison que la clé.
403scope_missingIl manque à la clé le droit nécessaire, en général write.
403account_data_lockedLes données du compte comme le mot de passe, l’adresse e-mail ou la suppression sont interdites aux clés.
403forbiddenTon compte n’a pas le droit, par exemple à cause d’un droit retiré ou d’un blocage.
403timed_outUne exclusion temporaire réduit ton compte au silence dans ce groupe en ce moment.
404unknown_pathCe chemin n’existe pas, ou pas avec cette méthode.
404not_foundIntrouvable, ou tu n’as pas le droit de le voir.
409conflictCela entre en conflit avec ce qui existe déjà, par exemple un nom déjà pris.
409feed_offLe salon du fil de ce groupe est désactivé.
413too_largeTrop volumineux pour cette instance.
422unprocessableLisible, mais pas possible sous cette forme.
429rate_limitedTrop de requêtes. Rien ne s’est passé ; attends et réessaie.
500internal_errorUne erreur s’est produite sur le serveur.

Versions

La version figure dans le chemin. Tant qu’il indique v2, chemins et champs restent les mêmes ; le nouveau s’ajoute seulement.

Les ajouts augmentent le deuxième chiffre. Chaque chemin indique depuis quand il existe.

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/ n’existe plus : les anciens chemins répondent 410 et indiquent le nouveau dans le corps.

Points d’accès

Tous les chemins d’un coup d’œil, puis chacun avec un exemple.

CheminDroitÀ quoi
L’entrée
GET/v2readVersion de l’API et nom de cette instance.
Publications
GET/v2/postsreadLes publications publiques, les plus récentes d’abord.
GET/v2/posts/{id}readUne seule publication, par son id.
POST/v2/postswritePublier une publication.
DELETE/v2/posts/{id}writeRetirer une de tes publications.
GET/v2/me/scheduledreadTes publications pas encore parues, et ce qu’elles attendent.
POST/v2/posts/{id}/schedulewriteChanger quand une publication programmée paraît, ou quand une publication se supprime d’elle-même.
POST/v2/posts/{id}/editwriteModifier le texte d’une de tes publications.
GET/v2/posts/{id}/reply-settingsreadQui peut répondre à ta publication, si les réponses attendent ta validation, et le mode lent.
PUT/v2/posts/{id}/reply-settingswriteModifier les réglages de réponse de ta publication. Ce que tu n’indiques pas reste inchangé.
POST/v2/posts/{id}/coauthorwriteAccepter ou refuser une invitation comme coauteur.
DELETE/v2/posts/{id}/coauthorwriteTe retirer comme coauteur ou, en tant qu’auteur, retirer le coauteur de la publication.
POST/v2/posts/{id}/pinwriteÉpingler ta publication en haut de ton profil, ou la désépingler.
Réponses
GET/v2/posts/{id}/repliesreadLes réponses à une publication, sans les comptes bloqués.
POST/v2/posts/{id}/replieswriteRépondre à une publication.
POST/v2/replies/{id}/editwriteModifier le texte d’une de tes réponses.
DELETE/v2/replies/{id}writeRetirer une de tes réponses.
POST/v2/replies/{id}/likewriteVoter pour une réponse (un j’aime est un vote positif depuis que les réponses se votent) ou retirer le vote ; un vote négatif reste.
POST/v2/replies/{id}/votewriteVoter pour ou contre une réponse, ou retirer ton vote. Répond avec ton vote et le score qui en résulte.
POST/v2/replies/{id}/pickwriteMettre en avant une réponse sous ta propre publication comme la meilleure, ou retirer la mise en avant.
GET/v2/posts/{id}/replies/waitingreadLes réponses en attente de validation sous une publication : toutes sous la tienne, sinon seulement les tiennes.
POST/v2/replies/{id}/decidewriteValider ou refuser une réponse en attente sous ta publication. Refusée, elle est supprimée.
GET/v2/posts/{id}/replies/plannedreadTes réponses programmées pour plus tard sous une publication.
PUT/v2/me/planned-replies/{id}writeModifier le texte ou l’heure d’une réponse programmée. Une réponse en échec attend à nouveau.
POST/v2/me/planned-replies/{id}/sendwriteEnvoyer tout de suite une réponse programmée.
DELETE/v2/me/planned-replies/{id}writeSupprimer une réponse programmée.
Sondages
POST/v2/posts/{id}/votewriteParticiper à un sondage.
Profils
GET/v2/profiles/{handle}readUn profil, par son identifiant court.
GET/v2/profiles/{handle}/postsreadLes publications publiques d’un profil, les plus récentes d’abord.
GET/v2/profiles/{handle}/eventsreadLes prochains événements d’un profil, les plus proches d’abord.
POST/v2/me/eventswriteCréer un événement. Répond avec son id.
PUT/v2/me/events/{id}writeModifier un de tes événements. Tous les champs sont redéfinis.
DELETE/v2/me/events/{id}writeSupprimer un de tes événements.
GET/v2/me/events/{id}/signupsreadQui s’est inscrit à un de tes événements.
POST/v2/events/{id}/signupwriteT’inscrire à un événement ou te désinscrire.
Groupes
GET/v2/communitiesreadLes groupes ouverts de cette instance ; avec mine=true, les groupes de ton compte.
GET/v2/communities/{id}readUn seul groupe, par son id.
GET/v2/communities/{id}/postsreadLes publications du salon du fil d’un groupe, les plus récentes d’abord.
GET/v2/communities/{id}/membersreadLes membres d’un groupe avec leurs rôles.
GET/v2/communities/{id}/rolesreadLes rôles d’un groupe, le plus haut d’abord, @everyone en dernier.
GET/v2/communities/{id}/bellreadQuelles notifications un groupe t’envoie.
GET/v2/invites/{code}readLe groupe derrière un lien d’invitation, avant de rejoindre.
PUT/v2/roles/{id}/selfwritePrendre ou retirer un rôle au choix.
GET/v2/communities/{id}/emojisreadLes emojis propres d’un groupe.
PUT/v2/communities/{id}/bellwriteChoisir quelles notifications un groupe t’envoie.
POST/v2/invites/{code}/joinwriteRejoindre un groupe avec un lien d’invitation.
GET/v2/communities/{id}/botsreadLes bots d’un groupe avec ce que leur rôle permet.
Salons
GET/v2/communities/{id}/channelsreadLes salons d’un groupe que tu vois, dans leur ordre.
GET/v2/channels/{id}/messagesreadLes messages d’un salon de discussion, les plus récents d’abord.
POST/v2/channels/{id}/messageswriteÉcrire un message dans un salon de discussion.
POST/v2/channels/{id}/readwriteMarquer un salon de discussion comme lu jusqu’à un moment donné.
DELETE/v2/channel-messages/{id}writeSupprimer un de tes messages dans un salon de discussion.
GET/v2/communities/{id}/voicereadQui est en ce moment dans les salons vocaux d’un groupe, par salon.
Gérer des groupes
POST/v2/communities/{id}/emojisgroupsDonner un emoji au groupe.
DELETE/v2/communities/{id}/emojis/{name}groupsRetirer un emoji du groupe.
POST/v2/communities/{id}/rolesgroupsCréer un rôle.
PUT/v2/roles/{id}groupsModifier le nom, la couleur et les droits d’un rôle.
DELETE/v2/roles/{id}groupsSupprimer un rôle.
PUT/v2/communities/{id}/roles/ordergroupsFixer le rang des rôles.
PUT/v2/roles/{id}/members/{member}groupsDonner un rôle à un membre ou le lui retirer.
POST/v2/communities/{id}/channelsgroupsCréer un salon de discussion.
PUT/v2/channels/{id}groupsModifier le nom, le sujet et la catégorie d’un salon.
DELETE/v2/channels/{id}groupsSupprimer un salon de discussion avec ses messages.
PUT/v2/communities/{id}/channels/ordergroupsFixer l’ordre des catégories et des salons de discussion.
PUT/v2/communities/{id}/channels/shapegroupsFixer la forme de tous les symboles de salon du groupe.
GET/v2/channels/{id}/overridesgroupsCe que des rôles peuvent faire autrement dans un salon que dans le groupe.
PUT/v2/channels/{id}/overrides/{role}groupsFixer ce qu’un rôle peut faire autrement dans un salon.
POST/v2/communities/{id}/categoriesgroupsCréer une catégorie de salons.
PUT/v2/categories/{id}groupsRenommer une catégorie.
DELETE/v2/categories/{id}groupsSupprimer une catégorie.
PUT/v2/communities/{id}/feedgroupsActiver ou désactiver le salon du fil d’un groupe.
GET/v2/communities/{id}/invitesgroupsLes liens d’invitation d’un groupe encore valides.
POST/v2/communities/{id}/invitesgroupsCréer un lien d’invitation.
DELETE/v2/invites/{code}groupsRetirer un lien d’invitation.
POST/v2/channel-messages/{id}/removegroupsRetirer d’un salon le message d’un autre membre.
POST/v2/communities/{id}/posts/{post}/removegroupsRetirer une publication d’un groupe.
DELETE/v2/communities/{id}/members/{member}groupsExpulser un membre d’un groupe.
PUT/v2/communities/{id}/members/{member}/timeoutgroupsRéduire un membre au silence.
DELETE/v2/communities/{id}/members/{member}/timeoutgroupsLever une exclusion temporaire.
GET/v2/communities/{id}/bansgroupsLes bannissements en cours d’un groupe.
PUT/v2/communities/{id}/bans/{member}groupsBannir un membre.
DELETE/v2/communities/{id}/bans/{member}groupsLever un bannissement.
GET/v2/communities/{id}/loggroupsLe journal de la direction : qui a retiré quoi et pourquoi.
POST/v2/communitiesgroupsFonder un groupe. Répond avec son id ; tu en es le fondateur.
PUT/v2/communities/{id}groupsModifier un groupe que tu diriges. Ce que tu n’indiques pas reste inchangé.
Bots
GET/v2/eventsreadLes événements des groupes du bot depuis un événement, page par page.
GET/v2/events/streamreadLes événements des groupes du bot dès qu’ils se produisent (server-sent events).
GET/v2/me/commandsreadLes commandes du bot.
PUT/v2/me/commandswriteDéfinir les commandes du bot, toutes à la fois.
POST/v2/interactions/{id}/replywriteRépondre à une commande ou à un bouton.
POST/v2/channels/{id}/voicewritePrendre une place dans un salon vocal pour jouer de la musique ou du son.
Découvrir
GET/v2/tagsreadLes tags qui tournent en ce moment.
GET/v2/searchreadUne recherche sur les publications, les noms, les identifiants courts et les tags.
GET/v2/emojisreadLes émojis propres à l’instance, avec l’adresse de leurs images.
GIF et vidéos
GET/v2/mediareadGIF ou vidéos partagés, les plus utilisés d’abord.
GET/v2/media/minemediaTa propre médiathèque, les plus récents d’abord.
GET/v2/media/{id}readUn GIF ou une vidéo, à toi ou partagé.
POST/v2/media/uploadsmediaCommencer un import.
PUT/v2/media/uploads/{upload}mediaEnvoyer un morceau du fichier.
POST/v2/media/{id}mediaModifier un de tes GIF ou une de tes vidéos.
DELETE/v2/media/{id}mediaSupprimer un de tes GIF ou une de tes vidéos.
Ton compte
GET/v2/mereadTon propre profil, avec l’id que les autres chemins attendent.
GET/v2/feedreadTon propre fil, tel que l’application le compose.
POST/v2/me/pictureswriteTéléverser une image, sous forme d’octets. Répond avec id et url ; tu utilises ensuite l’id comme photo de profil, bannière ou dans une publication.
PUT/v2/me/profileprofileModifier ton profil : nom, à propos, photo de profil, bannière et couleur du profil. Ce que tu n’indiques pas reste inchangé.
GET/v2/me/emojisreadTes propres emojis.
POST/v2/me/emojis/picturesprofileTéléverser l’image d’un emoji à toi, sous forme d’octets.
POST/v2/me/emojisprofileCréer un emoji à toi. Répond avec tous tes emojis.
DELETE/v2/me/emojis/{name}profileRetirer un emoji à toi. Répond avec les autres.
PUT/v2/me/emojis/sharingprofileDécider si tes abonnés peuvent utiliser tes emojis dans leurs propres textes.
GET/v2/me/webhookswebhooksTes webhooks avec leur état.
POST/v2/me/webhookswebhooksCréer un webhook. Répond avec l’id et le secret des signatures, cette fois seulement.
DELETE/v2/me/webhooks/{id}webhooksSupprimer un webhook.
POST/v2/me/webhooks/{id}/testwebhooksEnvoyer un test à un webhook.
Notifications
GET/v2/notificationsreadTes notifications, les plus récentes d’abord.
POST/v2/notifications/readwriteMarquer tes notifications comme lues.
Messages
GET/v2/conversationsreadTa boîte : une ligne par conversation, la plus récente d’abord.
GET/v2/conversations/{with}/messagesreadLes messages d’une conversation, les plus récents d’abord.
POST/v2/conversations/{with}/messageswriteEnvoyer un message dans une conversation.
POST/v2/conversations/{with}/readwriteMarquer tous les messages d’une conversation comme lus.
DELETE/v2/conversations/{with}/messages/{id}writeSupprimer un de tes messages.
POST/v2/conversations/{with}/plannedwriteProgrammer un message pour plus tard. Répond avec l’id du message programmé.
GET/v2/me/planned-messagesreadTes messages encore à envoyer, dans l’ordre de leur heure.
POST/v2/me/planned-messages/{id}/sendwriteEnvoyer maintenant un message programmé retenu ou en échec.
DELETE/v2/me/planned-messages/{id}writeSupprimer un message programmé avant son envoi.
Relations
POST/v2/relationswriteAimer, garder, partager, suivre, rejoindre, bloquer, masquer, selon kind.
GET/v2/profiles/{handle}/followersreadQui suit un profil, les plus récents d’abord.
GET/v2/profiles/{handle}/followingreadQui un profil suit, les plus récents d’abord.
GET/v2/me/relationsreadQui tu as bloqué, masqué ou bloqué pour les messages seulement, les plus récents d’abord.
Collections
GET/v2/me/collectionsreadTes collections avec le nombre de leurs publications.
POST/v2/me/collectionswriteCréer une collection. Répond avec son id.
PUT/v2/me/collections/{id}writeRenommer une collection.
DELETE/v2/me/collections/{id}writeSupprimer une collection.
GET/v2/me/collections/{id}/postsreadLes publications d’une collection, comme dans l’onglet des enregistrements.
POST/v2/me/collections/{id}/postswriteMettre une publication dans une collection ou l’en retirer.
Cadeaux
GET/v2/partner/quotareadCe qu’il reste à offrir dans ton contingent.
GET/v2/partner/giftsreadCe que tu as offert depuis ton contingent, à qui et quand – le plus récent d’abord.
POST/v2/partner/giftsgiftsOffrir des mois d’abonnement ou des étincelles de ton contingent à un membre.
GET/v2/gift-dropsreadTes cadeaux sous des publications : combien de places restent libres et comment ils ont été payés.
POST/v2/gift-dropsgiftsPublier une publication avec des cadeaux à récupérer.

L’entrée

La première requête de tout programme : la clé fonctionne-t-elle, et que peut-elle faire ?

GET/v2

Version de l’API et nom de cette instance.

  • Droit read
  • avec ETag
  • depuis v2.0

Sans barre oblique à la fin : https://api.tellmelo.com/v2/ redirige vers https://api.tellmelo.com/v2 avec 308, et tous les programmes ne suivent pas.

Exemple de requête

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

Réponse

Répond avec un Service.

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

Statuts possibles : 200304401429

Publications

Lire les publications publiques, publier les tiennes et les retirer.

GET/v2/posts

Les publications publiques, les plus récentes d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Sur les chemins publics, counts.likes et counts.reposts valent toujours 0 et pinned vaut false.

Les publications des groupes ne sont pas ici mais sous /communities/{id}/posts.

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Post, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

GET/v2/posts/{id}

Une seule publication, par son id.

  • Droit read
  • avec ETag
  • depuis v2.0

Sur les chemins publics, counts.likes et counts.reposts valent toujours 0 et pinned vaut false.

Les publications des groupes ne sont pas ici mais sous /communities/{id}/posts.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec un Post.

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

Statuts possibles : 200304400401404429

POST/v2/posts

Publier une publication.

  • Droit write
  • depuis v2.0

Une publication a besoin d’un texte ou d’un sondage. Longueur, options et rythme sont fixés par l’instance ; au-delà, la réponse est 400 ou 429.

Joins des images, un GIF ou une vidéo avec media. Un GIF ou une vidéo reste seul. Tu peux utiliser sur tellmelo les GIF et vidéos partagés par d’autres.

Une publication pour les amis proches ou avec coauteur part tout de suite, pas dans un groupe ni programmée. Les deux à la fois ne sont pas possibles.

Paramètres

NomTypeSignification
textdans le corpsstringfacultatifLe texte de la publication, de la réponse ou du message.
communitydans le corpsstringfacultatifL’id du groupe dont le salon du fil reçoit la publication ; il doit être activé et tu dois en avoir le droit. Sans lui, la publication n’est dans aucun groupe.
quotesdans le corpsstringfacultatifL’id de la publication que celle-ci cite.
polldans le corpsstring[]facultatifLes options sous forme de liste de textes.
mediadans le corpsstring[]facultatifID d’images importées dans l’app, ou d’un GIF ou d’une vidéo de la médiathèque (depuis 2.14).
audiencedans le corpsstringfacultatifQui voit la publication : everyone tous ceux qui peuvent la voir, close seulement tes amis proches.everyoneclose
coauthordans le corpsstringfacultatifL’id d’un compte que tu invites comme coauteur. Vous devez vous suivre mutuellement.

Exemple de requête

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"

Réponse

Répond avec un Created.

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

Statuts possibles : 200400401403429

DELETE/v2/posts/{id}

Retirer une de tes publications.

  • Droit write
  • depuis v2.0

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/me/scheduled

Tes publications pas encore parues, et ce qu’elles attendent.

  • Droit read
  • avec ETag
  • depuis v2.12

Exemple de requête

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

Réponse

Répond avec une page de ScheduledPost, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/posts/{id}/schedule

Changer quand une publication programmée paraît, ou quand une publication se supprime d’elle-même.

  • Droit write
  • depuis v2.12

Seulement tes propres publications. Tant que les cadeaux d’une publication ne sont pas payés, elle ne peut pas être programmée.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
publishAtdans le corpsintegerfacultatifQuand la publication programmée paraît, en millisecondes depuis 1970.
deleteAtdans le corpsintegerfacultatifQuand la publication se supprime d’elle-même, en millisecondes depuis 1970.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/posts/{id}/edit

Modifier le texte d’une de tes publications.

  • Droit write
  • depuis v2.12

Seulement pendant le délai de modification que t’accorde ton abonnement. Les publications programmées ne peuvent pas être modifiées.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
textdans le corpsstringobligatoireLe texte de la publication, de la réponse ou du message.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Qui peut répondre à ta publication, si les réponses attendent ta validation, et le mode lent.

  • Droit read
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec un ReplySettings.

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

Statuts possibles : 200304400401404429

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

Modifier les réglages de réponse de ta publication. Ce que tu n’indiques pas reste inchangé.

  • Droit write
  • depuis v2.19

Seulement tes propres publications.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
audiencedans le corpsstringfacultatifQui peut répondre : tout le monde, les comptes que tu suis, les personnes mentionnées ou personne.allfollowingmentionednobody
approvaldans le corpsbooleanfacultatifSi les réponses n’apparaissent qu’après ta validation.
slowdans le corpsstringfacultatifMode lent : auto s’active tout seul quand beaucoup de réponses arrivent, on toujours, off jamais.autoonoff

Exemple de requête

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"

Réponse

Répond avec un ReplySettings.

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

Statuts possibles : 200400401403404429

POST/v2/posts/{id}/coauthor

Accepter ou refuser une invitation comme coauteur.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
acceptdans le corpsbooleanobligatoiretrue accepte l’invitation, false la refuse.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

DELETE/v2/posts/{id}/coauthor

Te retirer comme coauteur ou, en tant qu’auteur, retirer le coauteur de la publication.

  • Droit write
  • depuis v2.19

Pour le coauteur et l’auteur de la publication.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/posts/{id}/pin

Épingler ta publication en haut de ton profil, ou la désépingler.

  • Droit write
  • depuis v2.19

Seulement tes publications visibles. Le nombre de publications épinglées dépend de ton abonnement.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
activedans le corpsbooleanobligatoiretrue épingle la publication, false la désépingle.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Réponses

Les réponses sous une publication, en liste avec parentId.

GET/v2/posts/{id}/replies

Les réponses à une publication, sans les comptes bloqués.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

La liste est plate et dans l’ordre d’écriture ; parentId en fait un arbre. Une page contient toujours des fils entiers. Les réponses des comptes bloqués sont exclues.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Reply, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/posts/{id}/replies

Répondre à une publication.

  • Droit write
  • depuis v2.0

En mode lent, une réponse par personne toutes les 10 minutes, sinon 429. L’auteur et les comptes qu’il suit en sont exemptés.

Avec media, au plus une image, un GIF ou une vidéo.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
textdans le corpsstringobligatoireLe texte de la publication, de la réponse ou du message.
parentIddans le corpsstringfacultatifL’id de la réponse à laquelle celle-ci répond. Sans elle, directement à la publication.
mediadans le corpsstring[]facultatifID d’images importées dans l’app, ou d’un GIF ou d’une vidéo de la médiathèque (depuis 2.14).
publishAtdans le corpsintegerfacultatifQuand la réponse doit paraître, en millisecondes depuis 1970. Sans cela, elle part tout de suite.

Exemple de requête

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"

Réponse

Répond avec un Created.

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

Statuts possibles : 200400401403404429

POST/v2/replies/{id}/edit

Modifier le texte d’une de tes réponses.

  • Droit write
  • depuis v2.12

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.
textdans le corpsstringobligatoireLe texte de la publication, de la réponse ou du message.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

DELETE/v2/replies/{id}

Retirer une de tes réponses.

  • Droit write
  • depuis v2.12

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/replies/{id}/like

Voter pour une réponse (un j’aime est un vote positif depuis que les réponses se votent) ou retirer le vote ; un vote négatif reste.

  • Droit write
  • depuis v2.12
  • obsolète

Obsolète depuis 2.19 : utilise POST /replies/{id}/vote. Cette route reste disponible pour l’instant.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.
activedans le corpsbooleanobligatoiretrue l’établit, false la retire.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/replies/{id}/vote

Voter pour ou contre une réponse, ou retirer ton vote. Répond avec ton vote et le score qui en résulte.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.
votedans le corpsstringobligatoireup vote pour, down vote contre, none retire ton vote.updownnone

Exemple de requête

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"

Réponse

Répond avec un ReplyVote.

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

Statuts possibles : 200400401403404429

POST/v2/replies/{id}/pick

Mettre en avant une réponse sous ta propre publication comme la meilleure, ou retirer la mise en avant.

  • Droit write
  • depuis v2.19

Seulement sous tes propres publications et seulement les réponses directes à la publication. Une nouvelle mise en avant remplace l’ancienne.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.
activedans le corpsbooleanobligatoiretrue met la réponse en avant, false retire la mise en avant.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Les réponses en attente de validation sous une publication : toutes sous la tienne, sinon seulement les tiennes.

  • Droit read
  • avec ETag
  • depuis v2.19

Si les réponses attendent, c’est l’auteur qui le règle dans les réglages de réponse.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec une page de Reply, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/replies/{id}/decide

Valider ou refuser une réponse en attente sous ta publication. Refusée, elle est supprimée.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant de la réponse.
approvedans le corpsbooleanobligatoiretrue valide la réponse, false la refuse.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Tes réponses programmées pour plus tard sous une publication.

  • Droit read
  • avec ETag
  • depuis v2.19

On programme avec publishAt en répondant. Au plus 20 réponses programmées à la fois.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.

Exemple de requête

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

Réponse

Répond avec une page de PlannedReply, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

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

Modifier le texte ou l’heure d’une réponse programmée. Une réponse en échec attend à nouveau.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la réponse programmée.
textdans le corpsstringfacultatifLe texte de la publication, de la réponse ou du message.
publishAtdans le corpsintegerfacultatifQuand la réponse doit paraître, en millisecondes depuis 1970. Sans cela, elle part tout de suite.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Envoyer tout de suite une réponse programmée.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la réponse programmée.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Supprimer une réponse programmée.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la réponse programmée.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Sondages

Un sondage est une publication dont poll est renseigné. Voter a son propre chemin.

POST/v2/posts/{id}/vote

Participer à un sondage.

  • Droit write
  • depuis v2.0

Les votes par option valent null jusqu’à ton vote ou la fin du sondage. total est toujours là.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une publication.
optiondans le corpsintegerobligatoireQuelle option, à partir de 0. Pour plusieurs choix, un appel par option.
retractdans le corpsbooleanfacultatiftrue retire le vote.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Profils

Les profils publics par leur nom court, et ce qu’ils ont publié.

GET/v2/profiles/{handle}

Un profil, par son identifiant court.

  • Droit read
  • avec ETag
  • depuis v2.0

Paramètres

NomTypeSignification
handledans le cheminstringobligatoireL’identifiant court d’un profil, majuscules ou minuscules indifféremment.

Exemple de requête

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

Réponse

Répond avec un Profile.

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

Statuts possibles : 200304400401404429

GET/v2/profiles/{handle}/posts

Les publications publiques d’un profil, les plus récentes d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Sur les chemins publics, counts.likes et counts.reposts valent toujours 0 et pinned vaut false.

Les publications des groupes ne sont pas ici mais sous /communities/{id}/posts.

Paramètres

NomTypeSignification
handledans le cheminstringobligatoireL’identifiant court d’un profil, majuscules ou minuscules indifféremment.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Post, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/profiles/{handle}/events

Les prochains événements d’un profil, les plus proches d’abord.

  • Droit read
  • avec ETag
  • depuis v2.19

Seulement tant que l’abonnement du profil inclut les événements. Rien entre des comptes qui se sont bloqués.

Paramètres

NomTypeSignification
handledans le cheminstringobligatoireL’identifiant court d’un profil, majuscules ou minuscules indifféremment.

Exemple de requête

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

Réponse

Répond avec une page de Event, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/me/events

Créer un événement. Répond avec son id.

  • Droit write
  • depuis v2.19

Nécessite un abonnement avec événements, sinon 403. Le nombre d’événements à venir dépend de l’abonnement.

Paramètres

NomTypeSignification
titledans le corpsstringobligatoireLe titre.
startsAtdans le corpsintegerobligatoireDébut, en millisecondes depuis 1970.
endsAtdans le corpsintegerfacultatifFin, en millisecondes depuis 1970. Facultatif.
placedans le corpsstringfacultatifOù il a lieu.
descriptiondans le corpsstringfacultatifUne description.
signupsdans le corpsbooleanfacultatifSi l’on peut s’inscrire. Nécessite un abonnement avec inscriptions.
capacitydans le corpsintegerfacultatifCombien de personnes peuvent s’inscrire au plus. Sans indication, pas de limite.

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403429

PUT/v2/me/events/{id}

Modifier un de tes événements. Tous les champs sont redéfinis.

  • Droit write
  • depuis v2.19

Un événement déjà commencé garde son début.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de l’événement.
titledans le corpsstringobligatoireLe titre.
startsAtdans le corpsintegerobligatoireDébut, en millisecondes depuis 1970.
endsAtdans le corpsintegerfacultatifFin, en millisecondes depuis 1970. Facultatif.
placedans le corpsstringfacultatifOù il a lieu.
descriptiondans le corpsstringfacultatifUne description.
signupsdans le corpsbooleanfacultatifSi l’on peut s’inscrire. Nécessite un abonnement avec inscriptions.
capacitydans le corpsintegerfacultatifCombien de personnes peuvent s’inscrire au plus. Sans indication, pas de limite.

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

DELETE/v2/me/events/{id}

Supprimer un de tes événements.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de l’événement.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Qui s’est inscrit à un de tes événements.

  • Droit read
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de l’événement.

Exemple de requête

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

Réponse

Répond avec une page de EventSignup, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/events/{id}/signup

T’inscrire à un événement ou te désinscrire.

  • Droit write
  • depuis v2.19

Seulement pour les événements avec inscription, pas les tiens. S’il est complet, 409.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de l’événement.
goingdans le corpsbooleanobligatoiretrue t’inscrit, false te désinscrit.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Groupes

Les groupes ouverts et les tiens, leurs publications, membres, rôles et liens d’invitation.

GET/v2/communities

Les groupes ouverts de cette instance ; avec mine=true, les groupes de ton compte.

  • Droit read
  • avec ETag
  • depuis v2.0

Triée par nombre de membres, sans pagination ; next vaut toujours null.

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
minedans l’adressebooleanfacultatiftrue pour les groupes de ton compte, internes et cachés compris, par nom.

Exemple de requête

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

Réponse

Répond avec une page de Community, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

GET/v2/communities/{id}

Un seul groupe, par son id.

  • Droit read
  • avec ETag
  • depuis v2.0

Les groupes internes et cachés seulement si ton compte en est membre.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec un Community.

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

Statuts possibles : 200304400401404429

GET/v2/communities/{id}/posts

Les publications du salon du fil d’un groupe, les plus récentes d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Sur les chemins publics, counts.likes et counts.reposts valent toujours 0 et pinned vaut false.

Si le salon du fil est désactivé, le chemin répond 409 avec feed_off.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Post, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/communities/{id}/members

Les membres d’un groupe avec leurs rôles.

  • Droit read
  • avec ETag
  • depuis v2.15

D’abord la direction, puis par rôle le plus haut ; 300 au plus.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de GroupMember, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/communities/{id}/roles

Les rôles d’un groupe, le plus haut d’abord, @everyone en dernier.

  • Droit read
  • avec ETag
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de Role, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/communities/{id}/bell

Quelles notifications un groupe t’envoie.

  • Droit read
  • avec ETag
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec un Bell.

Exemple
{
  "level": "important"
}

Statuts possibles : 200304400401404429

GET/v2/invites/{code}

Le groupe derrière un lien d’invitation, avant de rejoindre.

  • Droit read
  • avec ETag
  • depuis v2.15

Paramètres

NomTypeSignification
codedans le cheminstringobligatoireLe code d’un lien d’invitation, la fin de son adresse.

Exemple de requête

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

Réponse

Répond avec un InvitePreview.

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

Statuts possibles : 200304400401404429

PUT/v2/roles/{id}/self

Prendre ou retirer un rôle au choix.

  • Droit write
  • depuis v2.20

Seulement les rôles que la direction propose au choix (selfable), et seulement pour ton propre compte.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un rôle.
activedans le corpsbooleanfacultatiffalse retire le rôle ; sinon il est donné.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/emojis

Les emojis propres d’un groupe.

  • Droit read
  • avec ETag
  • depuis v2.20

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de GroupEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

PUT/v2/communities/{id}/bell

Choisir quelles notifications un groupe t’envoie.

  • Droit write
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
leveldans le corpsstringobligatoireQuelles notifications arrivent.allimportantoff

Exemple de requête

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"

Réponse

Répond avec un Bell.

Exemple
{
  "level": "important"
}

Statuts possibles : 200400401403404429

POST/v2/invites/{code}/join

Rejoindre un groupe avec un lien d’invitation.

  • Droit write
  • depuis v2.15

Paramètres

NomTypeSignification
codedans le cheminstringobligatoireLe code d’un lien d’invitation, la fin de son adresse.
rulesdans le corpsbooleanfacultatiftrue si tu acceptes les règles du groupe ; nécessaire s’il en a.

Exemple de requête

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

Réponse

Répond avec un Joined.

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

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/bots

Les bots d’un groupe avec ce que leur rôle permet.

  • Droit read
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de GroupBot, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

Salons

Les salons de tes groupes et leur discussion : lire, écrire, marquer comme lu.

GET/v2/communities/{id}/channels

Les salons d’un groupe que tu vois, dans leur ordre.

  • Droit read
  • avec ETag
  • depuis v2.15

Le salon du fil (kind: feed) n’apparaît ici que tant qu’il est activé ; ses publications passent par /communities/{id}/posts.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de Channel, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/channels/{id}/messages

Les messages d’un salon de discussion, les plus récents d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.15

Jusqu’à 50 messages par page. Les messages de comptes que tu as bloqués ou qui t’ont bloqué sont absents.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.
threaddans l’adressestringfacultatifLe message dont on lit le fil : lui et ses réponses au lieu du chat.

Exemple de requête

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

Réponse

Répond avec une page de ChannelMessage, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/channels/{id}/messages

Écrire un message dans un salon de discussion.

  • Droit write
  • depuis v2.15

@nom notifie un membre, @everyone avec le droit correspondant tout le monde, au plus six fois par heure.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.
textdans le corpsstringfacultatifLe texte de la publication, de la réponse ou du message.
replyTodans le corpsstringfacultatifL’id du message du même salon auquel tu réponds.
mediadans le corpsstring[]facultatifID d’images importées dans l’app, ou d’un GIF ou d’une vidéo de la médiathèque (depuis 2.14).
threaddans le corpsstringfacultatifLe message du chat dans le fil duquel on répond ; sans lui, le message va dans le chat.
carddans le corpsobjectfacultatifUne carte { title, text, color, fields: [{ name, value }] }, 10 champs au plus.
buttonsdans le corpsobject[]facultatifJusqu’à 5 boutons, chacun { id, label, style } avec style primary, secondary ou danger. Un appui arrive comme événement interaction.

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

POST/v2/channels/{id}/read

Marquer un salon de discussion comme lu jusqu’à un moment donné.

  • Droit write
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.
atdans le corpsintegerobligatoireJusqu’à quand c’est lu, en millisecondes, en général le createdAt du message le plus récent.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

DELETE/v2/channel-messages/{id}

Supprimer un de tes messages dans un salon de discussion.

  • Droit write
  • depuis v2.15

Seulement tes propres messages ; ceux des autres sont retirés par la direction avec l’autorisation groups.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un message dans un salon de discussion.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/voice

Qui est en ce moment dans les salons vocaux d’un groupe, par salon.

  • Droit read
  • avec ETag
  • depuis v2.19

Seulement les salons que tu peux voir. Sans serveur média, la liste est vide.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de VoiceRoom, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

Gérer des groupes

Ce que les paramètres d’un groupe permettent dans l’app, avec l’autorisation groups. Ce que ton compte peut faire, le groupe en décide comme dans l’app : direction, rôles et leur rang.

POST/v2/communities/{id}/emojis

Donner un emoji au groupe.

  • Droit groups
  • depuis v2.20

Seulement qui peut gérer les salons du groupe. L’image est téléversée comme un emoji à toi (POST /me/emojis/pictures) ; un nom n’est attribué qu’une fois pour tous les emojis.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le corpsstringobligatoireLe nom avec lequel tu écris l’emoji, sous la forme :nom:.
picturedans le corpsstringobligatoireL’id de POST /me/emojis/pictures.

Exemple de requête

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"

Réponse

Répond avec une page de GroupEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200400401403404429

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

Retirer un emoji du groupe.

  • Droit groups
  • depuis v2.20

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le cheminstringobligatoireLe nom de l’emoji, sans deux-points.

Exemple de requête

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

Réponse

Répond avec une page de GroupEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200400401403404429

POST/v2/communities/{id}/roles

Créer un rôle.

  • Droit groups
  • depuis v2.15

Seulement les rôles sous ton plus haut rôle et seulement les droits que tu as toi-même ; la direction est au-dessus de tous.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le corpsstringfacultatifLe nom du rôle ; @everyone garde le sien.
colordans le corpsstringfacultatifLa couleur ; vide pour aucune.indigovioletroseambergreenteal
permissionsdans le corpsstring[]facultatifLes droits : view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfabledans le corpsbooleanfacultatiftrue : les membres prennent le rôle eux-mêmes. Seulement pour les rôles qui ne permettent rien de plus que participer (view, send, attach, voice_connect, voice_speak, voice_video).

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

PUT/v2/roles/{id}

Modifier le nom, la couleur et les droits d’un rôle.

  • Droit groups
  • depuis v2.15

Remplace le nom, la couleur et les droits ; ce que tu omets devient vide.

Seulement les rôles sous ton plus haut rôle et seulement les droits que tu as toi-même ; la direction est au-dessus de tous.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un rôle.
namedans le corpsstringfacultatifLe nom du rôle ; @everyone garde le sien.
colordans le corpsstringfacultatifLa couleur ; vide pour aucune.indigovioletroseambergreenteal
permissionsdans le corpsstring[]facultatifLes droits : view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfabledans le corpsbooleanfacultatiftrue : les membres prennent le rôle eux-mêmes. Seulement pour les rôles qui ne permettent rien de plus que participer (view, send, attach, voice_connect, voice_speak, voice_video).

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

DELETE/v2/roles/{id}

Supprimer un rôle.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un rôle.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Fixer le rang des rôles.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
rolesdans le corpsstring[]obligatoireLes id de tous les rôles en dessous de ton rôle le plus élevé, le plus haut en premier ; pour la direction, tous sauf @everyone.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Donner un rôle à un membre ou le lui retirer.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un rôle.
memberdans le cheminstringobligatoireL’id du compte d’un membre.
activedans le corpsbooleanfacultatiffalse retire le rôle ; sinon il est donné.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/communities/{id}/channels

Créer un salon de discussion.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le corpsstringfacultatifLe nom, sans # ; vide pour le nom que l’app donne dans chaque langue.
topicdans le corpsstringfacultatifLe sujet affiché au-dessus du salon.
categorydans le corpsstringfacultatifL’id de la catégorie où va le salon ; vide pour aucune.
emojidans le corpsstringfacultatifUn emoji comme symbole.
icondans le corpsstringfacultatifUn symbole du jeu de l’app, par son nom.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagedans le corpsstringfacultatifL’id d’une image importée avec /media/emoji.
colordans le corpsstringfacultatifLa couleur de la vignette.brandindigovioletroseambergreentealred
shapedans le corpsstringfacultatifLa forme de la vignette ; un cercle sinon.circlesquaretrianglediamondhexagonoctagonshieldstar

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

PUT/v2/channels/{id}

Modifier le nom, le sujet et la catégorie d’un salon.

  • Droit groups
  • depuis v2.15

Remplace le nom, le sujet et la catégorie ; ce que tu omets devient vide.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.
namedans le corpsstringfacultatifLe nom, sans # ; vide pour le nom que l’app donne dans chaque langue.
topicdans le corpsstringfacultatifLe sujet affiché au-dessus du salon.
categorydans le corpsstringfacultatifL’id de la catégorie où va le salon ; vide pour aucune.
emojidans le corpsstringfacultatifUn emoji comme symbole.
icondans le corpsstringfacultatifUn symbole du jeu de l’app, par son nom.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagedans le corpsstringfacultatifL’id d’une image importée avec /media/emoji.
colordans le corpsstringfacultatifLa couleur de la vignette.brandindigovioletroseambergreentealred
shapedans le corpsstringfacultatifLa forme de la vignette ; un cercle sinon.circlesquaretrianglediamondhexagonoctagonshieldstar

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

DELETE/v2/channels/{id}

Supprimer un salon de discussion avec ses messages.

  • Droit groups
  • depuis v2.15

Le salon du fil ne peut pas être supprimé, seulement désactivé.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Fixer l’ordre des catégories et des salons de discussion.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
categoriesdans le corpsstring[]obligatoireLes id de toutes les catégories du groupe dans le nouvel ordre.
channelsdans le corpsstring[]obligatoireLes id de tous les salons de discussion du groupe dans le nouvel ordre.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Fixer la forme de tous les symboles de salon du groupe.

  • Droit groups
  • depuis v2.20

Réservé à la direction du groupe.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
shapedans le corpsstringfacultatifLa forme de tous les symboles du groupe ; omise, chaque salon a la sienne.circlesquaretrianglediamondhexagonoctagonshieldstar

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/channels/{id}/overrides

Ce que des rôles peuvent faire autrement dans un salon que dans le groupe.

  • Droit groups
  • avec ETag
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.

Exemple de requête

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

Réponse

Répond avec une page de ChannelOverride, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401403404429

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

Fixer ce qu’un rôle peut faire autrement dans un salon.

  • Droit groups
  • depuis v2.15

Pas pour les rôles égaux ou supérieurs à ton plus haut rôle.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.
roledans le cheminstringobligatoireL’id d’un rôle.
allowdans le corpsstring[]facultatifCe que le rôle peut faire ici en plus : dans une discussion view, send, attach, mention_everyone, moderate, dans le salon du fil view et post_feed.
denydans le corpsstring[]facultatifCe que le rôle ne peut pas faire ici, parmi les mêmes droits. Les deux listes vides suppriment la différence.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/communities/{id}/categories

Créer une catégorie de salons.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le corpsstringobligatoireLe nom de la catégorie.
emojidans le corpsstringfacultatifUn emoji comme symbole.
icondans le corpsstringfacultatifUn symbole du jeu de l’app, par son nom.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagedans le corpsstringfacultatifL’id d’une image importée avec /media/emoji.
colordans le corpsstringfacultatifLa couleur de la vignette.brandindigovioletroseambergreentealred

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

PUT/v2/categories/{id}

Renommer une catégorie.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une catégorie.
namedans le corpsstringobligatoireLe nom de la catégorie.
emojidans le corpsstringfacultatifUn emoji comme symbole.
icondans le corpsstringfacultatifUn symbole du jeu de l’app, par son nom.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imagedans le corpsstringfacultatifL’id d’une image importée avec /media/emoji.
colordans le corpsstringfacultatifLa couleur de la vignette.brandindigovioletroseambergreentealred

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

DELETE/v2/categories/{id}

Supprimer une catégorie.

  • Droit groups
  • depuis v2.15

Ses salons restent, sans catégorie.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’une catégorie.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

PUT/v2/communities/{id}/feed

Activer ou désactiver le salon du fil d’un groupe.

  • Droit groups
  • depuis v2.15

Désactivé, les publications restent enregistrées mais seuls leurs auteurs les voient.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
ondans le corpsbooleanobligatoiretrue active le salon du fil, false le désactive.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/invites

Les liens d’invitation d’un groupe encore valides.

  • Droit groups
  • avec ETag
  • depuis v2.15

La direction les voit tous, les autres seulement les leurs.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de InviteLink, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401403404429

POST/v2/communities/{id}/invites

Créer un lien d’invitation.

  • Droit groups
  • depuis v2.15

Un lien ne vaut que tant que tu peux inviter, et disparaît quand tu pars.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
daysdans le corpsintegerfacultatifCombien de jours le lien est valable ; sans, jusqu’à ce qu’il soit retiré.1730
usesdans le corpsintegerfacultatifCombien de fois le lien peut servir ; sans, sans limite.151025100

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

DELETE/v2/invites/{code}

Retirer un lien d’invitation.

  • Droit groups
  • depuis v2.15

Paramètres

NomTypeSignification
codedans le cheminstringobligatoireLe code d’un lien d’invitation, la fin de son adresse.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Retirer d’un salon le message d’un autre membre.

  • Droit groups
  • depuis v2.15

Inscrit au journal du groupe et 60 par heure au plus, comme dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un message dans un salon de discussion.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Retirer une publication d’un groupe.

  • Droit groups
  • depuis v2.15

Inscrit au journal du groupe et 60 par heure au plus, comme dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
postdans le cheminstringobligatoireL’id d’une publication.
reasondans le corpsstringobligatoireLa justification que lit le membre.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Expulser un membre d’un groupe.

  • Droit groups
  • depuis v2.15

Une expulsion depuis 2.16 : le membre peut revenir. Qui doit rester dehors est banni.

Seulement avec le droit correspondant et pour des membres en dessous de ton rôle le plus élevé ; la co-direction seulement en tant que fondateur.

Inscrit au journal du groupe et 60 par heure au plus, comme dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
memberdans le cheminstringobligatoireL’id du compte d’un membre.
reasondans le corpsstringobligatoireLa justification que lit le membre.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Réduire un membre au silence.

  • Droit groups
  • depuis v2.16

Une nouvelle exclusion remplace celle en cours. Quitter puis rejoindre le groupe n’y met pas fin.

Seulement avec le droit correspondant et pour des membres en dessous de ton rôle le plus élevé ; la co-direction seulement en tant que fondateur.

Inscrit au journal du groupe et 60 par heure au plus, comme dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
memberdans le cheminstringobligatoireL’id du compte d’un membre.
secondsdans le corpsintegerobligatoireCombien de temps, en secondes.60300600360086400604800
reasondans le corpsstringfacultatifUne raison que le membre lit ; facultative.

Exemple de requête

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"

Réponse

Répond avec un Until.

Exemple
{
  "until": 1758624600000
}

Statuts possibles : 200400401403404429

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

Lever une exclusion temporaire.

  • Droit groups
  • depuis v2.16

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
memberdans le cheminstringobligatoireL’id du compte d’un membre.

Exemple de requête

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"

Réponse

Répond avec un Until.

Exemple
{
  "until": 1758624600000
}

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/bans

Les bannissements en cours d’un groupe.

  • Droit groups
  • avec ETag
  • depuis v2.16

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de Ban, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401403404429

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

Bannir un membre.

  • Droit groups
  • depuis v2.16

Sans days, le bannissement dure jusqu’à ce qu’il soit levé.

Seulement avec le droit correspondant et pour des membres en dessous de ton rôle le plus élevé ; la co-direction seulement en tant que fondateur.

Inscrit au journal du groupe et 60 par heure au plus, comme dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
memberdans le cheminstringobligatoireL’id du compte d’un membre.
daysdans le corpsintegerfacultatifCombien de temps, en jours ; à omettre pour un bannissement sans fin.1730
reasondans le corpsstringobligatoireLa justification que lit le membre.

Exemple de requête

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"

Réponse

Répond avec un Until.

Exemple
{
  "until": 1758624600000
}

Statuts possibles : 200400401403404429

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

Lever un bannissement.

  • Droit groups
  • depuis v2.16

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
memberdans le cheminstringobligatoireL’id du compte d’un membre.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

GET/v2/communities/{id}/log

Le journal de la direction : qui a retiré quoi et pourquoi.

  • Droit groups
  • avec ETag
  • depuis v2.15

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.

Exemple de requête

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

Réponse

Répond avec une page de LogEntry, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401403404429

POST/v2/communities

Fonder un groupe. Répond avec son id ; tu en es le fondateur.

  • Droit groups
  • depuis v2.19

Nécessite la permission groups. Sans précision, le groupe est internal et libre d’accès ; un groupe caché sur invitation seulement. C’est l’exploitant qui décide si les membres peuvent fonder des groupes.

Paramètres

NomTypeSignification
namedans le corpsstringobligatoireLe nom, 60 caractères au plus.
descriptiondans le corpsstringfacultatifLa description, 240 caractères au plus.
handledans le corpsstringfacultatifL’identifiant pour les mentions @# et le lien : 3 à 30 minuscules, chiffres ou _.
tagsdans le corpsstring[]facultatifJusqu’à 5 #tags sur le sujet du groupe.
joinPolicydans le corpsstringfacultatifComment on rejoint : open librement, application sur candidature, invite sur invitation seulement.openapplicationinvite
visibilitydans le corpsstringfacultatifQui voit le groupe : open tout le monde, internal son contenu seulement les membres, hidden seulement les membres du tout.openinternalhidden

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403429

PUT/v2/communities/{id}

Modifier un groupe que tu diriges. Ce que tu n’indiques pas reste inchangé.

  • Droit groups
  • depuis v2.19

Nécessite la permission groups et la direction du groupe. La direction, la dissolution et les avantages des étincelles restent dans l’app.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un groupe.
namedans le corpsstringfacultatifLe nom, 60 caractères au plus.
descriptiondans le corpsstringfacultatifLa description, 240 caractères au plus.
handledans le corpsstringfacultatifL’identifiant pour les mentions @# et le lien : 3 à 30 minuscules, chiffres ou _.
tagsdans le corpsstring[]facultatifJusqu’à 5 #tags sur le sujet du groupe.
joinPolicydans le corpsstringfacultatifComment on rejoint : open librement, application sur candidature, invite sur invitation seulement.openapplicationinvite
visibilitydans le corpsstringfacultatifQui voit le groupe : open tout le monde, internal son contenu seulement les membres, hidden seulement les membres du tout.openinternalhidden
imagedans le corpsstringfacultatifL’id d’une image téléversée (POST /me/pictures) comme image du groupe. Vide la retire.
bannerdans le corpsstringfacultatifL’id d’une image téléversée comme bannière du groupe. Vide la retire.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Bots

Ce qui se passe dans les groupes d’un bot, en temps réel : en flux, page par page ou livré à une adresse.

GET/v2/events

Les événements des groupes du bot depuis un événement, page par page.

  • Droit read
  • depuis v2.20

Seulement avec le jeton d’un bot. Les événements d’un salon seulement si le bot peut le voir.

Les événements sont gardés un jour. next est le numéro du dernier, comme since pour la page suivante.

Paramètres

NomTypeSignification
sincedans l’adressestringfacultatifLe numéro du dernier événement que le bot a déjà. Sans lui, le flux commence maintenant et la liste au plus ancien.

Exemple de requête

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

Réponse

Répond avec une page de BotEvent, sous forme de `items` et `next`.

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

Statuts possibles : 200401429

GET/v2/events/stream

Les événements des groupes du bot dès qu’ils se produisent (server-sent events).

  • Droit read
  • avec ETag
  • depuis v2.20

La connexion reste ouverte et se ferme après dix minutes ; le client se reconnecte et envoie Last-Event-ID.

Seulement avec le jeton d’un bot. Les événements d’un salon seulement si le bot peut le voir.

Paramètres

NomTypeSignification
sincedans l’adressestringfacultatifLe numéro du dernier événement que le bot a déjà. Sans lui, le flux commence maintenant et la liste au plus ancien.

Exemple de requête

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

Réponse

Répond avec un BotEvent.

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

Statuts possibles : 200304401429

GET/v2/me/commands

Les commandes du bot.

  • Droit read
  • avec ETag
  • depuis v2.20

Seulement avec le jeton d’un bot. Les événements d’un salon seulement si le bot peut le voir.

Exemple de requête

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

Réponse

Répond avec une page de BotCommand, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

PUT/v2/me/commands

Définir les commandes du bot, toutes à la fois.

  • Droit write
  • depuis v2.20

Remplace toutes les commandes ; une liste vide les retire. Dans les chats que le bot peut voir, le champ de saisie les propose après « / ».

Paramètres

NomTypeSignification
commandsdans le corpsobject[]obligatoireJusqu’à 25 commandes, chacune { name, description }.

Exemple de requête

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"

Réponse

Répond avec une page de BotCommand, sous forme de `items` et `next`.

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

Statuts possibles : 200400401403429

POST/v2/interactions/{id}/reply

Répondre à une commande ou à un bouton.

  • Droit write
  • depuis v2.20

Dans les 15 minutes suivant l’événement command ou interaction ; avec private, seul celui qui a utilisé la commande ou le bouton voit la réponse.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’identifiant tiré de l’événement (data.interaction).
textdans le corpsstringfacultatifLe texte de la publication, de la réponse ou du message.
privatedans le corpsbooleanfacultatiftrue : seul celui qui a utilisé la commande ou le bouton voit la réponse, pendant un jour.
carddans le corpsobjectfacultatifUne carte { title, text, color, fields: [{ name, value }] }, 10 champs au plus.
buttonsdans le corpsobject[]facultatifJusqu’à 5 boutons, chacun { id, label, style } avec style primary, secondary ou danger. Un appui arrive comme événement interaction.

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

POST/v2/channels/{id}/voice

Prendre une place dans un salon vocal pour jouer de la musique ou du son.

  • Droit write
  • depuis v2.20

Seulement avec le jeton d’un bot, selon ce que permet son rôle dans le salon. Le programme se connecte avec un SDK LiveKit et envoie son son comme micro ; chacun règle son volume pour soi.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id d’un salon.

Exemple de requête

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

Réponse

Répond avec un VoiceSeat.

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

Statuts possibles : 200400401403404429

Découvrir

Tendances, recherche et les émojis propres à l’instance.

GET/v2/tags

Les tags qui tournent en ce moment.

  • Droit read
  • avec ETag
  • depuis v2.0

Au plus 10 tags tendance par points : chaque usage compte 1 et diminue de moitié tous les 3 jours, un compte compte au plus 3 par jour. posts est le score arrondi. limit raccourcit seulement la liste. Les tags mis en avant par l’équipe peuvent figurer plus haut.

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.

Exemple de requête

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

Réponse

Répond avec une page de Tag, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

GET/v2/search

Une recherche sur les publications, les noms, les identifiants courts et les tags.

  • Droit read
  • avec ETag
  • depuis v2.0

Cherche seulement le public : publications hors groupes, profils et tags. limit s’applique par type.

Paramètres

NomTypeSignification
qdans l’adressestringobligatoireLes mots cherchés.
typedans l’adressestringfacultatifQuel genre de résultat. Sans lui, tous les genres.allpostsprofilestags
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.

Exemple de requête

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

Réponse

Répond avec un SearchResult.

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

Statuts possibles : 200304400401429

GET/v2/emojis

Les émojis propres à l’instance, avec l’adresse de leurs images.

  • Droit read
  • avec ETag
  • depuis v2.1

Dans les textes, un émoji apparaît sous la forme :name:. Remplace-le par l’image de cette liste ; les noms inconnus restent du texte.

Exemple de requête

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

Réponse

Répond avec une page de Emoji, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

GIF et vidéos

La médiathèque : trouver des GIF et vidéos partagés, importer et gérer les tiens, et les intégrer sur d’autres sites web.

GET/v2/media

GIF ou vidéos partagés, les plus utilisés d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.14

Sans les comptes que tu as bloqués ou qui t’ont bloqué. Charge url et poster avec la clé dans l’en-tête, pour les publications sur tellmelo.

Pour d’autres sites web, uniquement ce qui a embed : ses adresses fonctionnent sans clé, dans n’importe quel navigateur.

Paramètres

NomTypeSignification
kinddans l’adressestringfacultatifgif ou video ; par défaut gif.gifvideo
qdans l’adressestringfacultatifMots présents dans le nom ou les mots-clés.
anywheredans l’adressebooleanfacultatiftrue : uniquement ce qui peut aussi apparaître sur d’autres sites web.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de MediaItem, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401429

GET/v2/media/mine

Ta propre médiathèque, les plus récents d’abord.

  • Droit media
  • paginé
  • avec ETag
  • depuis v2.14

Paramètres

NomTypeSignification
kinddans l’adressestringfacultatifgif ou video ; par défaut gif.gifvideo
qdans l’adressestringfacultatifMots présents dans le nom ou les mots-clés.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de MediaItem, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401403429

GET/v2/media/{id}

Un GIF ou une vidéo, à toi ou partagé.

  • Droit read
  • avec ETag
  • depuis v2.14

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’ID du GIF ou de la vidéo.

Exemple de requête

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

Réponse

Répond avec un MediaItem.

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

Statuts possibles : 200304400401404429

POST/v2/media/uploads

Commencer un import.

  • Droit media
  • depuis v2.14

Ensuite, envoie le fichier en morceaux d’au plus piece octets à /media/uploads/{upload}. Sans nouveau morceau, un import se termine après 15 minutes.

Les limites de l’app s’appliquent : GIF jusqu’à 15 Mo, vidéos selon l’abonnement en taille et en durée, GIF par jour, GIF privés, points vidéo par semaine. Sinon tu reçois 409, 413 ou 429.

Paramètres

NomTypeSignification
kinddans le corpsstringobligatoiregif ou video ; par défaut gif.gifvideo
sizedans le corpsintegerobligatoireLa taille du fichier entier en octets.
namedans le corpsstringobligatoireLe nom sous lequel on le trouve : 2 à 40 caractères.
keywordsdans le corpsstringfacultatifMots-clés pour la recherche, séparés par des espaces.
shareddans le corpsbooleanfacultatiftrue : partagé avec tout le monde sur tellmelo.
anywheredans le corpsbooleanfacultatiftrue : partagé et aussi autorisé sur d’autres sites web. Uniquement avec shared.

Exemple de requête

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"

Réponse

Répond avec un UploadStarted.

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

Statuts possibles : 200400401403429

PUT/v2/media/uploads/{upload}

Envoyer un morceau du fichier.

  • Droit media
  • depuis v2.14

Le corps est le morceau lui-même (application/octet-stream), pas du JSON. S’il ne fait pas suite, tu reçois 409 avec received : reprends à partir de là. Après le dernier morceau, le fichier est converti ; la réponse contient alors item.

Paramètres

NomTypeSignification
uploaddans le cheminstringobligatoireL’upload reçu au début.
offsetdans l’adresseintegerobligatoireOù le morceau commence dans le fichier, en octets ; 0 pour le premier.

Exemple de requête

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"

Réponse

Répond avec un UploadPiece.

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

Statuts possibles : 200400401403404429

POST/v2/media/{id}

Modifier un de tes GIF ou une de tes vidéos.

  • Droit media
  • depuis v2.14

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’ID du GIF ou de la vidéo.
namedans le corpsstringfacultatifLe nom sous lequel on le trouve : 2 à 40 caractères.
keywordsdans le corpsstringfacultatifMots-clés pour la recherche, séparés par des espaces.
shareddans le corpsbooleanfacultatiftrue : partagé avec tout le monde sur tellmelo.
anywheredans le corpsbooleanfacultatiftrue : partagé et aussi autorisé sur d’autres sites web. Uniquement avec shared.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

DELETE/v2/media/{id}

Supprimer un de tes GIF ou une de tes vidéos.

  • Droit media
  • depuis v2.14

Les publications qui l’affichent déjà le gardent. Sur d’autres sites web, il disparaît en quelques minutes.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’ID du GIF ou de la vidéo.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Ton compte

Ton profil, ton fil, tes propres emojis et tes webhooks.

GET/v2/me

Ton propre profil, avec l’id que les autres chemins attendent.

  • Droit read
  • avec ETag
  • depuis v2.0

Exemple de requête

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

Réponse

Répond avec un Profile.

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

Statuts possibles : 200304401429

GET/v2/feed

Ton propre fil, tel que l’application le compose.

  • Droit read
  • paginé
  • depuis v2.0

Pas d’ETag, car l’ordre change sans cesse. Une liste commencée reste la même jusqu’au bout.

Paramètres

NomTypeSignification
tabdans l’adressestringfacultatifQuel fil : for-you, following, latest ou bookmarks. latest par défaut.for-youfollowinglatestbookmarks
tagdans l’adressestringfacultatifSeulement les publications sur ce tag : écrites avec lui ou dans lesquelles le serveur le reconnaît. Sans lui, aucun filtre.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Post, sous forme de `items` et `next`.

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

Statuts possibles : 200400401429

POST/v2/me/pictures

Téléverser une image, sous forme d’octets. Répond avec id et url ; tu utilises ensuite l’id comme photo de profil, bannière ou dans une publication.

  • Droit write
  • depuis v2.19

PNG, JPEG, WebP ou GIF, reconnu à ses premiers octets ; réenregistré sans métadonnées. Une image utilisée nulle part est supprimée plus tard.

Exemple de requête

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"

Réponse

Répond avec un Picture.

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

Statuts possibles : 200401403429

PUT/v2/me/profile

Modifier ton profil : nom, à propos, photo de profil, bannière et couleur du profil. Ce que tu n’indiques pas reste inchangé.

  • Droit profile
  • depuis v2.19

Nécessite la permission profile. Ton @nom reste dans l’app : c’est aussi ton identifiant de connexion.

Paramètres

NomTypeSignification
namedans le corpsstringfacultatifLe nom affiché, 60 caractères au plus.
aboutdans le corpsstringfacultatifLe texte « À propos ».
avatardans le corpsstringfacultatifL’id d’une image téléversée comme photo de profil. Vide la retire.
bannerdans le corpsstringfacultatifL’id d’une image téléversée comme bannière. Vide la retire.
colordans le corpsstringfacultatifLa couleur du profil, avec un abonnement. null la retire.indigovioletrosecoralamberlimegreentealskyslatesandnight

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403429

GET/v2/me/emojis

Tes propres emojis.

  • Droit read
  • avec ETag
  • depuis v2.19

Exemple de requête

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

Réponse

Répond avec une page de OwnEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/me/emojis/pictures

Téléverser l’image d’un emoji à toi, sous forme d’octets.

  • Droit profile
  • depuis v2.19

Les emojis animés nécessitent un abonnement. Trop lourde après conversion, l’image est refusée.

Exemple de requête

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"

Réponse

Répond avec un EmojiPicture.

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

Statuts possibles : 200401403429

POST/v2/me/emojis

Créer un emoji à toi. Répond avec tous tes emojis.

  • Droit profile
  • depuis v2.19

Le nombre d’emojis que tu peux créer dépend de ton abonnement.

Paramètres

NomTypeSignification
namedans le corpsstringobligatoireLe nom avec lequel tu écris l’emoji, sous la forme :nom:.
picturedans le corpsstringobligatoireL’id de POST /me/emojis/pictures.

Exemple de requête

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"

Réponse

Répond avec une page de OwnEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200400401403429

DELETE/v2/me/emojis/{name}

Retirer un emoji à toi. Répond avec les autres.

  • Droit profile
  • depuis v2.19

Paramètres

NomTypeSignification
namedans le cheminstringobligatoireLe nom de l’emoji, sans deux-points.

Exemple de requête

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

Réponse

Répond avec une page de OwnEmoji, sous forme de `items` et `next`.

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

Statuts possibles : 200400401403404429

PUT/v2/me/emojis/sharing

Décider si tes abonnés peuvent utiliser tes emojis dans leurs propres textes.

  • Droit profile
  • depuis v2.19

Paramètres

NomTypeSignification
shareddans le corpsbooleanobligatoiretrue partage tes emojis avec tes abonnés, false non.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403429

GET/v2/me/webhooks

Tes webhooks avec leur état.

  • Droit webhooks
  • avec ETag
  • depuis v2.19

Nécessite la permission webhooks. Les webhooks viennent avec un abonnement organisation ou en tant que partenaire.

Exemple de requête

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

Réponse

Répond avec une page de Webhook, sous forme de `items` et `next`.

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

Statuts possibles : 200304401403429

POST/v2/me/webhooks

Créer un webhook. Répond avec l’id et le secret des signatures, cette fois seulement.

  • Droit webhooks
  • depuis v2.19

Chaque envoi est signé avec le secret (X-Tellmelo-Signature). Garde-le ; il ne sera plus affiché.

Paramètres

NomTypeSignification
urldans le corpsstringobligatoireUne adresse HTTPS hors réseaux locaux, sans identifiants.
kindsdans le corpsstring[]obligatoireCe dont le webhook est averti. Les types qui te sont ouverts dépendent de ton abonnement et de ton partenariat.replymentiongroup_mentionfollowlikerepostmessagequota_changedquota_giftdrop_claimeddrop_empty

Exemple de requête

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"

Réponse

Répond avec un WebhookCreated.

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

Statuts possibles : 200400401403429

DELETE/v2/me/webhooks/{id}

Supprimer un webhook.

  • Droit webhooks
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id du webhook.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Envoyer un test à un webhook.

  • Droit webhooks
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id du webhook.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Notifications

Ce qui s’est passé autour de ton compte, page par page.

GET/v2/notifications

Tes notifications, les plus récentes d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Lire ne marque rien comme lu ; c’est POST /notifications/read qui le fait. Les événements du même type sur la même publication tiennent sur une ligne ; more dit combien.

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Notification, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/notifications/read

Marquer tes notifications comme lues.

  • Droit write
  • depuis v2.0

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200401403429

Messages

Ta boîte et tes conversations. Une conversation porte le nom de l’autre compte.

GET/v2/conversations

Ta boîte : une ligne par conversation, la plus récente d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Conversation, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

GET/v2/conversations/{with}/messages

Les messages d’une conversation, les plus récents d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.0

Lire ne marque rien comme lu ; c’est POST /conversations/{with}/read qui le fait.

Paramètres

NomTypeSignification
withdans le cheminstringobligatoireL’id de l’autre compte. Une conversation n’a pas d’id propre.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Message, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

POST/v2/conversations/{with}/messages

Envoyer un message dans une conversation.

  • Droit write
  • depuis v2.0

Les règles de l’app s’appliquent : qui t’a bloqué est injoignable, et les réglages de l’autre personne comptent.

Les images, GIF et vidéos ne peuvent pas être joints aux messages via l’API, seulement dans l’app.

Paramètres

NomTypeSignification
withdans le cheminstringobligatoireL’id de l’autre compte. Une conversation n’a pas d’id propre.
textdans le corpsstringobligatoireLe texte de la publication, de la réponse ou du message.
replyTodans le corpsstringfacultatifL’id d’un message précédent de cette conversation auquel celui-ci répond. Depuis 2.2.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/conversations/{with}/read

Marquer tous les messages d’une conversation comme lus.

  • Droit write
  • depuis v2.1

Paramètres

NomTypeSignification
withdans le cheminstringobligatoireL’id de l’autre compte. Une conversation n’a pas d’id propre.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Supprimer un de tes messages.

  • Droit write
  • depuis v2.12

Seulement tes propres messages, et seulement dans les 24 heures après l’envoi.

Paramètres

NomTypeSignification
withdans le cheminstringobligatoireL’id de l’autre compte. Une conversation n’a pas d’id propre.
iddans le cheminstringobligatoireL’identifiant du message.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

POST/v2/conversations/{with}/planned

Programmer un message pour plus tard. Répond avec l’id du message programmé.

  • Droit write
  • depuis v2.19

Nécessite un abonnement avec les messages programmés, sinon 403. Avec le chiffrement de bout en bout des deux côtés, cela ne marche que dans l’app.

Paramètres

NomTypeSignification
withdans le cheminstringobligatoireL’id de l’autre compte. Une conversation n’a pas d’id propre.
textdans le corpsstringobligatoireLe texte de la publication, de la réponse ou du message.
sendAtdans le corpsintegerobligatoireQuand le message est envoyé, en millisecondes depuis 1970.

Exemple de requête

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"

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403404429

GET/v2/me/planned-messages

Tes messages encore à envoyer, dans l’ordre de leur heure.

  • Droit read
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
withdans l’adressestringfacultatifSeulement les messages pour ce compte (son id).

Exemple de requête

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

Réponse

Répond avec une page de PlannedMessage, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

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

Envoyer maintenant un message programmé retenu ou en échec.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id du message programmé.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Supprimer un message programmé avant son envoi.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id du message programmé.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Relations

J’aime, enregistrer, partager, suivre, rejoindre, bloquer : un seul chemin, activé et retiré avec active. Depuis 2.19 aussi les listes : abonnés, abonnements et tes propres blocages et masquages.

POST/v2/relations

Aimer, garder, partager, suivre, rejoindre, bloquer, masquer, selon kind.

  • Droit write
  • depuis v2.0

target est une publication pour like, save et repost, un groupe pour join, un compte pour follow, block et mute. active: false retire la relation.

Paramètres

NomTypeSignification
kinddans le corpsstringobligatoireQuelle relation : like, save, repost, follow, join, block ou mute (depuis 2.2).likesaverepostfollowjoinblockmute
targetdans le corpsstringobligatoireL’id de la publication, du profil ou du groupe, selon kind.
activedans le corpsbooleanfacultatiftrue l’établit, false la retire.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403429

GET/v2/profiles/{handle}/followers

Qui suit un profil, les plus récents d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
handledans le cheminstringobligatoireL’identifiant court d’un profil, majuscules ou minuscules indifféremment.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de ProfileBrief, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/profiles/{handle}/following

Qui un profil suit, les plus récents d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.19

Paramètres

NomTypeSignification
handledans le cheminstringobligatoireL’identifiant court d’un profil, majuscules ou minuscules indifféremment.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de ProfileBrief, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401404429

GET/v2/me/relations

Qui tu as bloqué, masqué ou bloqué pour les messages seulement, les plus récents d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.19

Seulement tes propres listes. Activer et retirer passe par POST /relations.

Paramètres

NomTypeSignification
kinddans l’adressestringobligatoireblock bloqués, mute masqués, dm_block bloqués pour les messages seulement.blockmutedm_block
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de ProfileBrief, sous forme de `items` et `next`.

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

Statuts possibles : 200304400401429

Collections

Range les publications enregistrées dans tes propres collections. Une publication peut être dans plusieurs ; retirée d’une collection, elle reste enregistrée.

GET/v2/me/collections

Tes collections avec le nombre de leurs publications.

  • Droit read
  • avec ETag
  • depuis v2.19

Exemple de requête

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

Réponse

Répond avec une page de Collection, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/me/collections

Créer une collection. Répond avec son id.

  • Droit write
  • depuis v2.19

Le nombre de collections que tu peux créer dépend de ton abonnement.

Paramètres

NomTypeSignification
namedans le corpsstringobligatoireLe nom, 40 caractères au plus. Unique par compte, sans tenir compte de la casse.

Exemple de requête

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

Réponse

Répond avec un Made.

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

Statuts possibles : 200400401403429

PUT/v2/me/collections/{id}

Renommer une collection.

  • Droit write
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la collection.
namedans le corpsstringobligatoireLe nom, 40 caractères au plus. Unique par compte, sans tenir compte de la casse.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

DELETE/v2/me/collections/{id}

Supprimer une collection.

  • Droit write
  • depuis v2.19

Les publications qu’elle contient restent enregistrées.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la collection.

Exemple de requête

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

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

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

Les publications d’une collection, comme dans l’onglet des enregistrements.

  • Droit read
  • paginé
  • depuis v2.19

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la collection.
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de Post, sous forme de `items` et `next`.

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

Statuts possibles : 200400401404429

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

Mettre une publication dans une collection ou l’en retirer.

  • Droit write
  • depuis v2.19

Mettre une publication l’enregistre aussi. Publications visibles seulement.

Paramètres

NomTypeSignification
iddans le cheminstringobligatoireL’id de la collection.
postdans le corpsstringobligatoireL’id de la publication.
insidedans le corpsbooleanfacultatiftrue met la publication (par défaut), false la retire.

Exemple de requête

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"

Réponse

Répond avec un Ok.

Exemple
{
  "ok": true
}

Statuts possibles : 200400401403404429

Cadeaux

Consulter le contingent d’un partenaire et offrir depuis celui-ci, mettre des cadeaux sous des publications et les suivre. Les récupérer reste réservé aux personnes, dans l’app.

GET/v2/partner/quota

Ce qu’il reste à offrir dans ton contingent.

  • Droit read
  • avec ETag
  • depuis v2.12

Réservé aux partenaires avec un contingent ; les autres reçoivent 403.

Exemple de requête

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

Réponse

Répond avec un Quota.

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

Statuts possibles : 200304401429

GET/v2/partner/gifts

Ce que tu as offert depuis ton contingent, à qui et quand – le plus récent d’abord.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.12

Réservé aux partenaires avec un contingent ; les autres reçoivent 403.

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de QuotaGift, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/partner/gifts

Offrir des mois d’abonnement ou des étincelles de ton contingent à un membre.

  • Droit gifts
  • depuis v2.12

Réservé aux partenaires avec un contingent ; les autres reçoivent 403.

Comme dans l’app, le membre voit de qui vient le cadeau. 60 cadeaux par heure au maximum.

Paramètres

NomTypeSignification
handledans le corpsstringobligatoireLe @nom du membre à qui tu offres, avec ou sans @.
itemdans le corpsstringobligatoireplan pour des mois d’abonnement, sparks pour des étincelles, shop pour un look de ta réserve (depuis 2.13).plansparksshop
quantitydans le corpsintegerfacultatifCombien : jusqu’à 12 mois ou 35 étincelles par cadeau.
itemIddans le corpsstringfacultatifPour shop : l’ID du look, tel que looks l’indique dans le contingent. Un exemplaire par cadeau ; quantity ne s’applique alors pas.

Exemple de requête

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"

Réponse

Répond avec un Quota.

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

Statuts possibles : 200400401403429

GET/v2/gift-drops

Tes cadeaux sous des publications : combien de places restent libres et comment ils ont été payés.

  • Droit read
  • paginé
  • avec ETag
  • depuis v2.12

Paramètres

NomTypeSignification
limitdans l’adresseintegerfacultatifEntrées par page : 20 par défaut, 50 au plus.
cursordans l’adressestringfacultatifLe next de la réponse précédente. Sans lui, depuis le début.

Exemple de requête

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

Réponse

Répond avec une page de OwnGiftDrop, sous forme de `items` et `next`.

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

Statuts possibles : 200304401429

POST/v2/gift-drops

Publier une publication avec des cadeaux à récupérer.

  • Droit gifts
  • depuis v2.12

Gratuit pour le propriétaire et les membres de l’équipe qui en ont le droit, sinon pris sur ton contingent. Ce qui devrait être payé est refusé avec 422 – payer ne se fait que dans l’app.

Récupérer ne se fait que dans l’app, pour qu’aucun programme ne rafle toutes les places. Le nombre de places libres figure dans giftDrop de la publication.

Paramètres

NomTypeSignification
textdans le corpsstringfacultatifLe texte de la publication, de la réponse ou du message.
communitydans le corpsstringfacultatifL’id du groupe dont le salon du fil reçoit la publication ; il doit être activé et tu dois en avoir le droit. Sans lui, la publication n’est dans aucun groupe.
itemdans le corpsstringobligatoireplan pour des mois d’abonnement, sparks pour des étincelles.plansparks
quantitydans le corpsintegerobligatoireCe que contient chaque place : jusqu’à 12 mois ou 35 étincelles.
placesdans le corpsintegerobligatoirePour combien de personnes, jusqu’à 10 000.
audiencedans le corpsstringfacultatifQui peut récupérer : all tout le monde, followers seulement tes abonnés, group seulement les membres du groupe (uniquement avec community).allfollowersgroup
newAccountsdans le corpsbooleanfacultatiftrue permet aussi aux comptes de moins de 7 jours de récupérer. Sans ce paramètre, ils sont exclus.

Exemple de requête

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"

Réponse

Répond avec un DropCreated.

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

Statuts possibles : 200400401403429

Objets

Tous les objets, champ par champ. [] signifie liste.

Service

La réponse de la racine : qui répond, et ce que cette clé peut faire.

ChampTypeSignification
namestringToujours tellmelo.
versionstringLa version de l’API, par exemple 2.1.
scopestringCe que cette clé peut faire : read ou read write.
rateLimitRateLimitLe quota de cette clé.
docsstringOù se trouve cette documentation, comme chemin sur cette instance.
specstringOù se trouve la description lisible par machine.
Exemple
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

RateLimit

Le quota de cette clé dans la minute en cours.

ChampTypeSignification
limitintegerRequêtes par minute.
remainingintegerCombien il en reste dans cette minute.
Exemple
{
  "limit": 120,
  "remaining": 117
}

Post

Une publication, sous la même forme partout.

ChampTypeSignification
idstringL’identifiant de la publication.
textstringou nullLe texte tel qu’écrit (null pour une publication qui n’est qu’un sondage ou que des images).
kindstringCe qu’est la publication.
  • post — Une publication avec du texte, des images ou une citation.
  • poll — Une publication avec un sondage.
authorProfileBriefQui l’a écrite.
communityCommunityBriefou nullLe groupe où elle a été écrite (null hors de tout groupe).
mediaMedia[]Ses images, dans l’ordre ; vide s’il n’y en a pas.
pollPollou nullLe sondage (null s’il n’y en a pas).
quotesstringou nullL’identifiant de la publication que celle-ci cite.
continuesstringou nullL’identifiant de la publication que celle-ci prolonge, comme complément.
countsCountsRéponses, mentions J’aime et republications.
pinnedbooleanSi elle est épinglée en haut du profil de son auteur.
giftDropGiftDropou nullLes cadeaux à récupérer sous la publication (null s’il n’y en a pas).
createdAtintegerQuand elle a été écrite.
Exemple
{
  "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

Une réponse sous une publication : une publication avec deux champs de plus.

Chaque champ de Post, et en plus :

ChampTypeSignification
postIdstringLa publication à laquelle toute la conversation est rattachée.
parentIdstringou nullLa réponse à laquelle celle-ci répond (null si elle répond directement à la publication).
Exemple
{
  "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

Ton vote sur une réponse et son score.

ChampTypeSignification
votestringTon vote.
  • up — Pour.
  • down — Contre.
  • none — Pas de vote.
scoreintegerVotes pour moins votes contre, aussi en dessous de zéro.
Exemple
{
  "vote": "up",
  "score": 12
}

PlannedReply

Une de tes réponses programmée pour plus tard.

ChampTypeSignification
idstringL’id de la réponse programmée.
parentIdstringou nullLa réponse à laquelle elle répondra (null si elle répond directement à la publication).
textstringLe texte.
publishAtintegerQuand elle paraît.
statestringSon état.
  • waiting — Attend son heure.
  • failed — N’a pas pu être envoyée, par exemple parce que la publication n’existe plus.
Exemple
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "parentId": null,
  "text": "Count me in for Saturday!",
  "publishAt": 1758710400000,
  "state": "waiting"
}

ReplySettings

Les réglages de réponse d’une de tes publications.

ChampTypeSignification
audiencestringQui peut répondre.
  • all — Tout le monde.
  • following — Les comptes que tu suis.
  • mentioned — Les personnes mentionnées dans la publication.
  • nobody — Personne d’autre que toi.
approvalbooleanSi les réponses attendent ta validation.
slowstringLe mode lent.
  • auto — S’active tout seul quand beaucoup de réponses arrivent.
  • on — Toujours actif.
  • off — Désactivé.
Exemple
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Counts

Combien de réponses, de mentions J’aime et de republications a une publication.

ChampTypeSignification
repliesintegerLes réponses, tous niveaux confondus.
likesintegerLes mentions J’aime.
repostsintegerLes republications.
Exemple
{
  "replies": 4,
  "likes": 31,
  "reposts": 2
}

Media

Une image d’une publication ou d’un message.

ChampTypeSignification
urlstringL’adresse de l’image ou de la vidéo, relative à cette instance. Charge-la avec la clé dans l’en-tête.
kindstringimage, video ou gif (depuis 2.10). Les vidéos et les GIF sont des fichiers MP4.
  • image — Une image (WebP ou JPEG).
  • video — Une vidéo en MP4, avec le son.
  • gif — Un GIF, en MP4 muet qui tourne en boucle.
posterstringou nullPour les vidéos et les GIF, l’adresse de l’image d’aperçu, sinon null (depuis 2.10).
aistringou nullSi l’image a été créée avec l’IA, comme l’a indiqué la personne qui l’a importée ou comme l’équipe l’a marquée après un signalement ; null sans mention (depuis 2.11).
  • with — Créé avec l’IA.
  • without — Créé sans IA.
Exemple
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null,
  "ai": "without"
}

Poll

Le sondage d’une publication.

ChampTypeSignification
optionsPollOption[]Les réponses, dans l’ordre. option d’un vote compte à partir de 0.
totalintegerTous les votes ensemble, toujours présent.
multiplebooleanSi l’on peut choisir plus d’une réponse.
endsAtintegerou nullQuand le sondage se termine (null s’il n’a pas de fin).
runningbooleanSi l’on peut encore voter.
resultsVisiblebooleanSi les voix par réponse sont montrées (voir votes).
myVotesinteger[]Les réponses que tu as choisies, comptées à partir de 0.
Exemple
{
  "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

Une réponse d’un sondage.

ChampTypeSignification
textstringLa réponse.
votesintegerou nullSes voix (null tant que le résultat est retenu).
Exemple
{
  "text": "Lavender",
  "votes": 12
}

ProfileBrief

Un profil tel qu’il apparaît dans d’autres objets : comme auteur, dans une recherche.

ChampTypeSignification
idstringL’identifiant du compte : ce qu’attendent /relations et /conversations/{with}.
handlestringLe nom court, sans @, écrit comme le membre l’a choisi.
namestringLe nom affiché. Il peut contenir des émojis, y compris :name:.
verifiedbooleanSi le compte est vérifié.
accountKindstringQuel genre de compte c’est.
  • person — Une personne.
  • business — Une entreprise.
  • association — Une association.
  • automated — Un compte automatisé, comme un bot.
  • bot — Un bot de groupes, piloté par un programme avec sa propre clé (depuis 2.18).
Exemple
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person"
}

Profile

Un profil seul, avec sa description et ses abonnés.

Chaque champ de ProfileBrief, et en plus :

ChampTypeSignification
aboutstringou nullLa description (null s’il n’y en a pas).
websitestringou nullLe site web du profil (null s’il n’y en a pas). Depuis 2.3.
websiteVerifiedbooleanSi le site renvoie vers ce profil avec rel=me, vérifié chaque semaine. Depuis 2.3.
followersintegerCombien de comptes le suivent.
createdAtintegerou nullQuand le compte a été créé (null tant que le membre masque la date d’inscription ; depuis 2.9).
Exemple
{
  "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

Le groupe dans lequel une publication a été écrite.

ChampTypeSignification
idstringL’identifiant du groupe.
namestringou nullSon nom.
Exemple
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening"
}

Community

Un groupe de cette instance.

ChampTypeSignification
idstringL’identifiant du groupe.
namestringSon nom.
handlestringou nullLe nom court pour mentionner le groupe avec @#. Depuis 2.15.
descriptionstringou nullLa description (null s’il n’y en a pas).
tagsstring[]Les sujets dont elle traite.
membersintegerCombien de membres elle compte.
joinPolicystringComment on y entre.
  • open — Tout le monde peut rejoindre.
  • application — Rejoindre demande une candidature que le groupe accepte.
  • invite — Seulement sur invitation.
visibilitystringQui le voit. internal et hidden seulement ses membres (depuis 2.15).
  • open — Visible par tout le monde.
  • internal — Absent de l’annuaire, mais accessible par son adresse.
  • hidden — Seulement pour ses membres.
feedChannelbooleanSi son salon du fil est activé. Depuis 2.15.
sparksintegerCombien d’étincelles le groupe détient en ce moment (depuis 2.19).
perksstring[]Les avantages que paient ses étincelles (depuis 2.19).
membershipMembershipou nullCe que ton compte est et peut faire dans le groupe ; null s’il n’en est pas membre. Depuis 2.15.
Exemple
{
  "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

Ce que ton compte est et peut faire dans le groupe.

ChampTypeSignification
leaderstringou nullSi tu as fondé le groupe ou le co-diriges ; null sinon.
  • founder — Fondé.
  • manager — Co-direction.
rolesstring[]Les id de tes rôles, le plus haut d’abord.
permissionsstring[]Ce que tu peux faire dans le groupe.
mutedUntilintegerou nullJusqu’à quand une exclusion temporaire te réduit au silence ici ; null sinon.
Exemple
{
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "mutedUntil": null
}

Person

Un membre, en bref.

ChampTypeSignification
idstringL’id du compte.
handlestringLe nom d’utilisateur, sans @.
namestringLe nom affiché.
botbooleanSi le compte est un bot (depuis 2.18).
Exemple
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false
}

Channel

Un salon d’un groupe.

ChampTypeSignification
idstringL’id.
kindstringLe type de salon.
  • feed — Le salon du fil, dont les publications figurent aussi dans le fil public.
  • chat — Une discussion.
  • voice — Un salon vocal ; on n’y parle que dans l’app.
  • hub — L’accueil du groupe : sa page qui le présente. Toujours là, sans messages.
namestringou nullLe nom sans # ; null pour le nom que l’app donne dans chaque langue.
topicstringLe sujet ; vide s’il n’y en a pas.
categoryChannelCategoryou nullLa catégorie ; null sans catégorie.
unreadintegerCombien de messages des autres tu n’as pas encore lus, jusqu’à 100.
permissionsstring[]Ce que tu peux faire dans ce salon.
symbolChannelSymbolSon symbole ; la forme est déjà celle du groupe s’il en fixe une.
Exemple
{
  "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

La catégorie dans laquelle se trouve un salon.

ChampTypeSignification
idstringL’id.
namestringLe nom.
symbolChannelSymbolSon symbole.
Exemple
{
  "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "name": "Garden",
  "symbol": {
    "emoji": null,
    "icon": null,
    "image": null,
    "color": null,
    "shape": null
  }
}

ChannelSymbol

Le symbole d’un salon ou d’une catégorie : au plus un emoji, un symbole ou une image, sinon le signe de son type.

ChampTypeSignification
emojistringou nullL’emoji ; null sinon.
iconstringou nullLe nom du symbole du jeu de l’app ; null sinon.
imagestringou nullL’adresse de l’image propre ; null sinon.
colorstringou nullLa couleur de la vignette ; null pour celle de son type.
shapestringou nullLa forme de la vignette ; null pour un cercle.
Exemple
{
  "emoji": "🌻",
  "icon": null,
  "image": null,
  "color": "amber",
  "shape": "circle"
}

ChannelMessage

Un message dans un salon de discussion.

ChampTypeSignification
idstringL’id.
textstringou nullLe texte (null pour un message composé seulement d’images ou de voix).
authorPersonQui l’a écrit.
mediaMedia[]Ses images et messages vocaux ; vide s’il n’y en a pas.
replyTostringou nullL’id du message auquel il répond ; null sinon.
roleColorstringou nullLa couleur du rôle le plus élevé de l’auteur qui en a une ; null sinon.
threadOfstringou nullLe message dans le fil duquel celui-ci répond ; null dans le chat.
threadCountintegerCombien de réponses compte le fil de ce message.
cardobjectou nullLa carte d’un bot : title, text, color et fields ; sinon null.
buttonsobject[]Les boutons d’un bot : chacun id, label et style.
createdAtintegerQuand il a été écrit.
Exemple
{
  "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

Un rôle d’un groupe.

ChampTypeSignification
idstringL’id.
namestringou nullLe nom ; null pour @everyone.
everyonebooleanS’il s’agit de @everyone, le rôle de tous les membres.
colorstringou nullLa couleur : indigo, violet, rose, amber, green ou teal ; null sans couleur.
permissionsstring[]Ses droits.
membersintegerCombien l’ont ; pour @everyone tous les membres.
editablebooleanSi ton compte peut le modifier.
selfablebooleanSi les membres prennent et retirent le rôle eux-mêmes.
Exemple
{
  "id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "name": "Gardeners",
  "everyone": false,
  "color": "green",
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "members": 24,
  "editable": true,
  "selfable": false
}

GroupMember

Un membre d’un groupe avec ses rôles.

Chaque champ de Person, et en plus :

ChampTypeSignification
leaderstringou nullSi le membre a fondé le groupe ou le co-dirige ; null sinon.
  • founder — Fondé.
  • manager — Co-direction.
rolesstring[]Les id de ses rôles, le plus haut d’abord.
mutedUntilintegerou nullJusqu’à quand une exclusion temporaire réduit le membre au silence, si ton compte peut en donner ; sinon null.
Exemple
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false,
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "mutedUntil": null
}

ChannelOverride

Ce qu’un rôle peut faire autrement dans un salon que dans le groupe.

ChampTypeSignification
rolestringL’id du rôle.
allowstring[]Ce qu’il peut faire en plus ici.
denystring[]Ce qu’il ne peut pas faire ici.
Exemple
{
  "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "allow": [
    "send"
  ],
  "deny": []
}

Bell

La cloche d’un groupe.

ChampTypeSignification
levelstringQuelles notifications arrivent.
  • all — Chaque nouvelle publication du salon du fil, plus @everyone.
  • important — Les publications de la direction dans le salon du fil, plus @everyone.
  • off — Rien, sauf si tu es mentionné·e avec @nom.
Exemple
{
  "level": "important"
}

InviteLink

Un lien d’invitation d’un groupe.

ChampTypeSignification
codestringLe code.
urlstringL’adresse à partager.
createdByPersonou nullQui l’a créé ; null si le compte est supprimé.
createdAtintegerQuand il a été créé.
expiresAtintegerou nullJusqu’à quand il est valable ; null sans fin.
usesintegerCombien de fois il a servi.
maxUsesintegerou nullCombien de fois il peut servir ; null sans limite.
Exemple
{
  "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

Où mène un lien d’invitation.

ChampTypeSignification
communityInviteGroupLe groupe.
memberbooleanSi ton compte est déjà membre.
Exemple
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

InviteGroup

Le groupe derrière un lien d’invitation.

ChampTypeSignification
idstringL’id.
namestringLe nom.
membersintegerCombien de membres il compte.
rulesstring[]Ses règles, acceptées en rejoignant ; vide s’il n’y en a pas.
Exemple
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "members": 312,
  "rules": [
    "Be kind.",
    "No advertising."
  ]
}

Joined

L’adhésion avec un lien d’invitation.

ChampTypeSignification
communitystringL’id du groupe.
Exemple
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

LogEntry

Une entrée du journal de la direction.

ChampTypeSignification
idstringL’id.
actionstringCe qui s’est passé.
  • post_removed — Une publication.
  • member_removed — Un membre retiré, avant 2.16 (exclu pendant 90 jours).
  • message_removed — Un message dans un salon de discussion.
  • member_kicked — Une expulsion.
  • member_banned — Un bannissement.
  • member_unbanned — Un bannissement levé.
  • member_timed_out — Une exclusion temporaire.
  • timeout_lifted — Une exclusion temporaire levée.
  • voice_muted — Rendu muet dans un salon vocal.
  • voice_removed — Déconnecté d’un salon vocal.
  • bot_added — Un bot a été ajouté au groupe (depuis 2.18).
  • bot_removed — Un bot a été retiré du groupe (depuis 2.18).
memberPersonQui était concerné.
reasonstringLa raison ; vide pour les messages et quand aucune n’a été donnée.
bystringou nullLe nom de qui l’a fait ; null si le compte est supprimé.
createdAtintegerQuand.
Exemple
{
  "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

Un bannissement d’un groupe.

ChampTypeSignification
memberPersonQui est banni.
untilintegerou nullJusqu’à quand ; null jusqu’à ce qu’il soit levé.
createdAtintegerou nullDepuis quand ; null pour les bannissements d’avant 2.16.
bystringou nullLe nom de qui a banni ; null si inconnu.
Exemple
{
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "until": 1759228800000,
  "createdAt": 1758624000000,
  "by": "Mara 🌻"
}

Until

Quand une exclusion temporaire ou un bannissement prend fin.

ChampTypeSignification
untilintegerou nullLe moment ; null pour un bannissement sans fin ou une exclusion levée.
Exemple
{
  "until": 1758624600000
}

Tag

Un tag et combien de publications le portent.

ChampTypeSignification
tagstringLe tag, sans #.
postsintegerCombien de publications récentes le portent.
Exemple
{
  "tag": "garden",
  "posts": 58
}

SearchResult

Trois listes, éventuellement vides.

ChampTypeSignification
postsPost[]Les publications trouvées, les plus récentes d’abord.
profilesProfileBrief[]Les profils trouvés, par nom court.
tagsTag[]Les tags trouvés, les plus utilisés d’abord.
Exemple
{
  "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

Un émoji de cette instance.

ChampTypeSignification
namestringLe nom, tel qu’il figure entre les deux-points.
urlstringL’adresse de l’image, relative à cette instance.
Exemple
{
  "name": "tellmelo",
  "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
}

Notification

Une notification. Une ligne peut regrouper plusieurs évènements du même type.

ChampTypeSignification
idstringL’identifiant de la notification.
kindstringCe qui s’est passé.
  • reply — Quelqu’un t’a répondu.
  • like — Quelqu’un aime ta publication.
  • reply_like — Quelqu’un vote pour ta réponse.
  • duel — Quelqu’un te défie au Duel de publications, ou ton défi a été joué.
  • reply_pick — L’auteur d’une publication met ta réponse en avant.
  • repost — Quelqu’un a republié ta publication.
  • follow — Quelqu’un te suit.
  • mention — Quelqu’un t’a mentionné.
  • group_mention — Quelqu’un a mentionné un groupe que tu diriges ; text est son nom.
  • channel_mention — Quelqu’un t’a mentionné·e dans un salon de discussion d’un de tes groupes, @everyone compris ; le membre est l’actor, la phrase nomme le salon et le groupe, jamais le message.
  • message — Quelqu’un t’a écrit un message.
  • scheduled — Une de tes publications programmées est parue.
  • video — Une de tes publications qui attendait sa vidéo est parue ou est redevenue un brouillon.
  • reminder — Un rappel sur une publication enregistrée est arrivé.
  • report — Ce qu’est devenu un signalement que tu as envoyé.
  • moderation — Une décision sur ton compte : un avertissement, une restriction, un recours.
  • team — Nouveau travail pour l’équipe (propriétaires, admins et modérateurs uniquement).
  • reward — Une récompense d’invitation risque de disparaître ou a disparu.
  • gift — Un cadeau de l’équipe : un abonnement, ou des étincelles pour toi ou pour un groupe que tu animes.
  • present — Un cadeau d’un membre : des étincelles ou du temps d’abonnement ; le membre est l’actor.
  • spark — Des étincelles expirent bientôt, ou un groupe que vous dirigez n’a plus assez d’étincelles pour ses avantages.
  • loyalty — À propos du rythme de fidélité : une semaine active compte ou il lui manque un jour, une récompense est nouvelle ou risque de disparaître.
  • impact — L’accueil de tes publications de douze heures après un jour, en une seule notification.
  • discovery — Une invitation au programme Découvert, ou qu’une place y commence ou s’arrête.
  • group_post — Une nouvelle publication dans un groupe dont la cloche sonne pour cela.
  • group_moderation — La direction d’un groupe a retiré une de tes publications, ou toi, du groupe.
  • group — Quelque chose qu’un membre a fait avec toi dans un groupe : t’inviter, t’accepter ou te refuser, te nommer co-administrateur, te transmettre le groupe ou le dissoudre, ou se porter candidat dans ton groupe ; le membre est l’actor, le nom du groupe termine la phrase.
  • coauthor — Quelqu’un t’a invité comme coauteur d’une publication.
  • partner — Un rappel du programme partenaire, ou la fin du badge partenaire.
  • news — Un nouvel article dans une région que tu suis.
  • pick — Une de tes publications est en lice pour la publication de la semaine ou de l’année, ou elle a gagné.
  • advent — Une nouvelle case du calendrier de l’Avent est ouverte, une case a été ouverte ou celle du jour attend encore.
  • team_message — Un message que l’équipe tellmelo a écrit à des membres choisis.
  • challenge — Un nouveau défi de la semaine a commencé.
  • nudge — Une seule fois : une publication à laquelle personne n’a encore répondu, ou le défi en cours.
  • signin — Un ordinateur demande si tu es en train de t’y connecter.
textstringou nullSeulement pour les signalements et la modération : le texte associé, sinon null.
actorActorQui l’a fait.
postIdstringou nullLa publication concernée (null s’il n’y en a pas).
readbooleanSi elle a été marquée comme lue.
moreintegerPour combien d’autres évènements cette ligne compte, au-delà de celui qui est nommé.
createdAtintegerQuand c’est arrivé la première fois.
updatedAtintegerQuand elle a regroupé un évènement pour la dernière fois. La liste est triée ainsi.
Exemple
{
  "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

Qui a déclenché une notification.

ChampTypeSignification
handlestringLe nom court.
namestringLe nom affiché.
Exemple
{
  "handle": "jon",
  "name": "Jon"
}

Conversation

Une ligne de ta boîte de réception.

ChampTypeSignification
withstringL’identifiant de l’autre compte : ce qu’attend /conversations/{with}/messages.
handlestringSon nom court.
namestringSon nom affiché.
excerptstringou nullLe début du dernier message (null s’il n’a pas de texte).
truncatedbooleanSi l’extrait a été raccourci.
fromMebooleanSi le dernier message est de toi.
lastMessageIdstringL’identifiant du dernier message.
unreadintegerCombien de ses messages tu n’as pas encore lus.
updatedAtintegerQuand le dernier message a été écrit.
Exemple
{
  "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

Un message dans une conversation.

ChampTypeSignification
idstringL’identifiant du message.
textstringou nullLe texte (null pour un message qui n’est fait que d’images).
fromstringL’identifiant du compte qui l’a écrit.
tostringL’identifiant du compte à qui il a été écrit.
readbooleanSi le destinataire l’a lu.
mediaMedia[]Ses images ; vide s’il n’y en a pas.
replyTostringou nullL’id du message auquel celui-ci répond (null s’il ne répond à aucun). Depuis 2.2.
createdAtintegerQuand il a été envoyé.
Exemple
{
  "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

Un de tes messages programmé pour plus tard.

ChampTypeSignification
idstringL’id du message programmé.
tostringL’id du compte qui le reçoit.
textstringou nullLe texte, null avec le chiffrement de bout en bout.
sendAtintegerQuand il est envoyé.
statestringSon état.
  • waiting — Attend son heure.
  • held — Retenu car l’abonnement a pris fin. Tu peux l’envoyer toi-même ou le supprimer.
  • failed — N’a pas pu être envoyé.
Exemple
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "text": "Happy birthday! 🎂",
  "sendAt": 1758710400000,
  "state": "waiting"
}

ScheduledPost

Une de tes publications pas encore parue.

ChampTypeSignification
idstringL’identifiant de la publication.
textstringou nullLe texte.
communityIdstringou nullLe groupe où elle paraît (null hors des groupes).
publishAtintegerou nullQuand elle paraît (null tant qu’elle attend autre chose).
deleteAtintegerou nullQuand elle se supprime d’elle-même (null : jamais).
waitingForstringCe qu’elle attend.
  • time — Son heure.
  • review — La validation d’un texte écrit pour relecture.
  • check — La vérification par la modération automatique.
  • payment — Le paiement de ses cadeaux.
createdAtintegerQuand elle a été écrite.
Exemple
{
  "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

Une collection de publications enregistrées.

ChampTypeSignification
idstringL’id de la collection.
namestringSon nom.
countintegerCombien de publications elle contient.
Exemple
{
  "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
  "name": "Recipes",
  "count": 12
}

Event

Un prochain événement d’un profil.

ChampTypeSignification
idstringL’id de l’événement.
titlestringLe titre.
startsAtintegerDébut.
endsAtintegerou nullFin, null sans fin.
placestringou nullLe lieu.
descriptionstringou nullLa description.
signupsEventSignupsou nullLes inscriptions, null sans inscription.
Exemple
{
  "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

Combien de personnes se sont inscrites.

ChampTypeSignification
countintegerLe nombre d’inscriptions.
goingbooleanSi tu es inscrit.
Exemple
{
  "count": 14,
  "going": true
}

EventSignup

Quelqu’un qui s’est inscrit à un de tes événements.

ChampTypeSignification
idstringL’id du compte.
handlestringL’identifiant.
namestringLe nom affiché.
atintegerQuand il s’est inscrit.
Exemple
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "at": 1758624000000
}

Picture

Une image téléversée.

ChampTypeSignification
idstringL’id de l’image.
urlstringOù on peut la voir.
Exemple
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

EmojiPicture

L’image téléversée d’un emoji.

ChampTypeSignification
idstringL’id de l’image.
urlstringOù on peut la voir.
animatedbooleanSi elle bouge.
Exemple
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

OwnEmoji

Un de tes propres emojis.

ChampTypeSignification
namestringSon nom.
urlstringSon image.
animatedbooleanS’il bouge.
restingbooleanEn pause car l’abonnement permet moins d’emojis pour l’instant : il reste, mais n’est pas utilisable.
Exemple
{
  "name": "sunflower",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false,
  "resting": false
}

GroupEmoji

Un emoji d’un groupe.

ChampTypeSignification
namestringSon nom.
urlstringSon image.
animatedbooleanS’il bouge.
Exemple
{
  "name": "seedling",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

BotEvent

Un événement dans un groupe du bot.

ChampTypeSignification
idstringSon numéro, croissant ; c’est avec lui qu’on continue (since, Last-Event-ID).
typestringCe qui s’est passé.
  • message.created — Un message a été écrit.
  • message.deleted — Un message a été supprimé.
  • member.joined — Quelqu’un a rejoint.
  • member.left — Quelqu’un est parti ou a été retiré.
  • voice.joined — Quelqu’un a rejoint un salon vocal.
  • command — Quelqu’un a utilisé une commande du bot.
  • interaction — Quelqu’un a appuyé sur un bouton d’un message du bot.
communitystringLe groupe.
channelstringou nullLe salon ; null pour tout le groupe.
createdAtintegerQuand c’est arrivé.
dataobjectCe qui l’accompagne, selon le type : message, member (avec reason), command ou interaction.
Exemple
{
  "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

Une commande d’un bot.

ChampTypeSignification
namestringSon nom, sans « / ».
descriptionstringCe qu’elle fait.
Exemple
{
  "name": "dice",
  "description": "Rolls a die"
}

VoiceSeat

Une place dans un salon vocal.

ChampTypeSignification
urlstringL’adresse du serveur média (LiveKit).
tokenstringLe jeton pour ce salon, valable quelques minutes.
iceServersobject[]Les serveurs STUN et TURN pour la connexion.
speakbooleanSi le bot peut y envoyer du son.
videobooleanSi le bot peut y envoyer de la vidéo.
Exemple
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Webhook

Un de tes webhooks.

ChampTypeSignification
idstringL’id du webhook.
urlstringSon adresse.
kindsstring[]Ce dont il est averti.
activebooleanS’il reçoit les envois. Après de nombreux échecs d’affilée, il est désactivé.
lastStatusintegerou nullLe statut HTTP du dernier envoi.
lastAtintegerou nullQuand a eu lieu le dernier envoi.
failuresintegerÉchecs d’affilée.
Exemple
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "url": "https://example.org/tellmelo-hook",
  "kinds": [
    "reply",
    "mention"
  ],
  "active": true,
  "lastStatus": 200,
  "lastAt": 1758624000000,
  "failures": 0
}

WebhookCreated

Un nouveau webhook avec son secret.

ChampTypeSignification
idstringL’id du webhook.
secretstringLe secret des signatures, cette fois seulement.
Exemple
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

GroupBot

Un bot d’un groupe.

ChampTypeSignification
idstringL’id du compte du bot.
handlestringSon identifiant.
namestringSon nom.
descriptionstringCe qu’il fait, selon son propriétaire.
permissionsstring[]Ce que son rôle dans le groupe permet.
Exemple
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "gardenbot",
  "name": "Garden bot",
  "description": "Reminds the group of watering days.",
  "permissions": [
    "send",
    "view"
  ]
}

VoiceRoom

Un salon vocal avec les personnes présentes.

ChampTypeSignification
channelstringL’id du salon.
peopleVoicePerson[]Qui y est en ce moment.
Exemple
{
  "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

Quelqu’un dans un salon vocal.

ChampTypeSignification
idstringL’id du compte.
handlestringL’identifiant.
namestringLe nom affiché.
mutedbooleanSi son micro est coupé.
deafbooleanSi la personne n’entend rien (son propre choix).
camerabooleanSi sa caméra est allumée.
screenbooleanSi l’écran est partagé.
Exemple
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "muted": true,
  "deaf": false,
  "camera": false,
  "screen": false
}

GiftDrop

Des cadeaux sous une publication – jamais avec le nom de ceux qui les ont récupérés.

ChampTypeSignification
itemstringCe que contient une place.
  • plan — Mois d’abonnement (Soutien).
  • sparks — Étincelles.
quantityintegerCombien contient chaque place : mois ou étincelles.
placesintegerCombien de places il y a en tout.
leftintegerCombien sont encore libres.
audiencestringQui peut récupérer.
  • all — Tout le monde.
  • followers — Seulement les abonnés de la personne qui offre.
  • group — Seulement les membres du groupe de la publication.
newAccountsbooleanSi les comptes de moins de 7 jours peuvent aussi récupérer.
statusstringOù en sont les choses.
  • awaiting_payment — En attente de paiement ; la publication n’est pas encore parue.
  • open — Il reste des places à récupérer.
  • closed — Terminé : tout est parti, le paiement a été remboursé ou la publication supprimée.
claimedbooleanSi tu as déjà une place toi-même (toujours false sur les chemins publics).
Exemple
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": true
}

OwnGiftDrop

Tes cadeaux sous une publication, avec la publication et le mode de paiement.

Chaque champ de GiftDrop, et en plus :

ChampTypeSignification
postIdstringLa publication sous laquelle ils se trouvent.
fundingstringComment ils sont payés.
  • free — Gratuit.
  • quota — Pris sur le contingent.
  • payment — Payé.
createdAtintegerQuand ils ont été créés.
Exemple
{
  "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

Ce que contient un contingent.

ChampTypeSignification
monthsintegerMois d’abonnement encore à offrir.
sparksintegerÉtincelles encore à offrir.
looksQuotaLook[]Looks de la réserve encore à offrir (depuis 2.13).
Exemple
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

QuotaLook

Un look dans la réserve d’un partenaire, avec les exemplaires restants (depuis 2.13).

ChampTypeSignification
idstringL’ID du look ; à indiquer comme itemId quand tu l’offres.
namestringLe nom du look.
kindstringLe type de look.
  • frame — Cadre de profil.
  • background — Effet de couverture.
  • card — Carte de profil.
quantityintegerCombien d’exemplaires il reste.
Exemple
{
  "id": "frame-gold",
  "name": "Goldring",
  "kind": "frame",
  "quantity": 25
}

QuotaGift

Un cadeau pris sur le contingent.

ChampTypeSignification
itemstringCe qui a été offert.
  • plan — Mois d’abonnement (Soutien).
  • sparks — Étincelles.
  • shop — Un look de la réserve (depuis 2.13).
quantityintegerCombien.
itemIdstringou nullLe look offert quand item vaut shop ; sinon null.
recipientActorÀ qui.
createdAtintegerQuand.
Exemple
{
  "item": "plan",
  "quantity": 3,
  "itemId": null,
  "recipient": {
    "handle": "jon",
    "name": "Jon"
  },
  "createdAt": 1758627600000
}

MediaItem

Un GIF ou une vidéo de la médiathèque (depuis 2.14).

ChampTypeSignification
idstringL’ID ; pour media lors d’une publication.
kindstringGIF ou vidéo.
  • gif — Un GIF, en MP4 muet qui tourne en boucle.
  • video — Une vidéo en MP4, avec le son.
namestringLe nom.
keywordsstringLes mots-clés, en minuscules.
widthintegerLargeur en pixels.
heightintegerHauteur en pixels.
secondsintegerDurée en secondes ; 0 pour les GIF.
urlstringLe fichier MP4, relatif à cette instance. Charge-le avec la clé dans l’en-tête.
posterstringL’image d’aperçu, également avec la clé.
uploaderActorQui l’a importé.
minebooleanSi c’est le tien.
sharedbooleanS’il est partagé avec tout le monde sur tellmelo.
anywherebooleanS’il peut aussi apparaître sur d’autres sites web.
embedEmbedou nullLes adresses pour d’autres sites web ; null tant que ce n’y est pas autorisé.
Exemple
{
  "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

Les adresses pour d’autres sites web. Elles fonctionnent sans clé.

ChampTypeSignification
pagestringLe lecteur pour un <iframe>.
filestringLe fichier MP4 pour ton propre lecteur.
posterstringL’image d’aperçu.
codestringLe code d’intégration prêt à l’emploi.
Exemple
{
  "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

Un import commencé.

ChampTypeSignification
uploadstringL’ID de cet import.
pieceintegerLa taille maximale d’un morceau, en octets.
Exemple
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

UploadPiece

Un morceau arrivé.

ChampTypeSignification
receivedintegerCombien d’octets sont arrivés.
itemMediaItemou nullAprès le dernier morceau, le nouveau GIF ou la nouvelle vidéo, sinon null.
Exemple
{
  "received": 4194304,
  "item": null
}

Created

La réponse d’une écriture qui a créé quelque chose.

ChampTypeSignification
idstringL’identifiant de ce qui a été créé.
scheduledForintegerou nullQuand cela apparaît, si la publication a été programmée (sinon null).
deleteAtintegerou nullQuand cela se supprime tout seul, si c’était réglé (sinon null).
Exemple
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

DropCreated

La réponse quand une publication avec des cadeaux a été créée.

ChampTypeSignification
idstringL’identifiant de la nouvelle publication.
fundingstringComment les cadeaux sont payés.
  • free — Gratuit.
  • quota — Pris sur le contingent.
Exemple
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Made

Ce qui vient d’être créé ou modifié.

ChampTypeSignification
idstringL’id ; pour un lien d’invitation, son code.
Exemple
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Ok

La réponse d’une écriture qui n’a rien à rendre.

ChampTypeSignification
okbooleanToujours true.
Exemple
{
  "ok": true
}

La description lisible par une machine

La table derrière cette page est disponible en OpenAPI sous https://api.tellmelo.com/v2/openapi.json.

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

GIF et vidéos sur d’autres sites web

Ce qu’un membre partage et autorise aussi sur d’autres sites web, n’importe quel site peut l’afficher : la recherche avec anywhere=true le trouve, et son embed contient les adresses. Si le membre le retire, il y disparaît en quelques minutes.

Import en morceaux

D’abord commencer, puis envoyer le fichier en morceaux. Découpe un fichier plus grand en morceaux de piece octets, avec offset à la position de chacun. Après le dernier morceau, tu reçois le GIF ou la vidéo terminé.

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

Intégrer

Le lecteur affiche le GIF en boucle ou la vidéo avec les commandes, et en dessous le nom et qui l’a partagé. Place le code de embed.code dans la page :

<iframe src="https://tellmelo.com/media-embed/b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918" width="480" height="300" title="Happy bees" style="border:0;max-width:100%" loading="lazy" allowfullscreen></iframe>

Les forums et programmes qui connaissent oEmbed récupèrent le code eux-mêmes quand on leur donne l’adresse du lecteur :

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

La clé a sa place sur ton serveur, jamais dans le code d’une page web. Recherche et importe via ton serveur ; les adresses dans embed n’ont pas besoin de clé.

Sélecteur de GIF pour ton site

Avec une clé de site (Espace développeurs → Sélecteur de GIF pour ton site), ton site obtient une recherche toute prête : deux lignes dans la page, et un clic sur le bouton l’ouvre. La clé est publique et ne fonctionne que sur les adresses que tu indiques pour elle. Le sélecteur ne montre que ce que les membres ont autorisé sur d’autres sites web.

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

Lors d’un choix, le bouton déclenche tellmelo:pick avec l’élément : code pour l’intégrer, file, poster, name et author. Avec data-target="#field", il insère directement code dans un champ de texte ; avec data-kind="video", il cherche des vidéos. Si tu intègres le fichier toi-même, affiche le nom de la personne qui l’a partagé.

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

Se connecter avec tellmelo

D’autres sites permettent aux membres de se connecter avec leur compte tellmelo via OpenID Connect (code d’autorisation avec PKCE). Le site ne reçoit que le nom d’utilisateur, l’adresse e-mail confirmée et un identifiant propre par membre (sub).

Tu demandes une app sous « Espace développeurs → Se connecter avec tellmelo ». L’équipe vérifie chaque app ; ensuite tu y vois l’ID client et, pour les apps avec serveur, tu crées le secret client, affiché une seule fois.

Tout ce dont une bibliothèque a besoin se trouve dans le document de découverte :

https://tellmelo.com/.well-known/openid-configuration
  1. Envoie le membre vers /oauth/authorize avec response_type=code, client_id, redirect_uri (exactement comme enregistré), scope=openid profile email, state, nonce et code_challenge avec code_challenge_method=S256.
  2. Échange le code dans la minute auprès de /oauth/token : grant_type=authorization_code, code, redirect_uri et code_verifier ; les apps avec serveur envoient aussi le secret, en authentification Basic ou dans le formulaire.
  3. Le jeton d’identité (RS256, clés sous /oauth/jwks) contient sub, avec profile aussi preferred_username, avec email aussi email et email_verified. Le jeton d’accès vaut 10 minutes et ne lit que /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
}

Il n’y a pas de jetons de rafraîchissement : tellmelo connecte et ne donne aucun accès durable. Si un membre retire le site ou si l’équipe suspend l’app, /oauth/userinfo répond aussitôt 401. prompt=none vérifie sans page, prompt=consent redemande.

Ce que nous attendons

Les mêmes règles s’appliquent partout : pas de harcèlement, pas de spam, pas de contenus d’autrui sans en avoir les droits. Tu réponds de ce que publie ta clé.

N’affiche les GIF et vidéos d’autres membres sur ton site web que s’ils ont embed, via ces adresses et avec le nom de la personne qui les a partagés. Si quelque chose n’est plus disponible, arrête de l’afficher. Ne copie pas les fichiers dans ta propre collection.

Mentions légalesConfidentialitéConditions d’utilisationÉtatApplications