tellmelo.DesarrolladoresIr a tellmelo
Centro de ayudaSoporteLegalDesarrolladores

API

Primeros pasos

  • Quiero …
  • Visión general
  • Inicio rápido
  • Probar
  • Tu clave
  • Lo que puede una clave
  • Bots

Fundamentos

  • Peticiones y respuestas
  • Páginas
  • Solo lo nuevo
  • Límites
  • Cabeceras
  • Cuando algo no funciona
  • Versiones

Rutas

  • Rutas
  • La entrada
    • GET /
  • Publicaciones
    • 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
  • Respuestas
    • 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}
  • Encuestas
    • POST /posts/{id}/vote
  • Perfiles
    • 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
  • Grupos
    • 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
  • Canales
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gestionar grupos
    • 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
  • Descubrir
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF y vídeos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Tu cuenta
    • 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
  • Notificaciones
    • GET /notifications
    • POST /notifications/read
  • Mensajes
    • 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}
  • Relaciones
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Colecciones
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Regalos
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objetos

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

Más

  • La descripción legible por una máquina
  • GIF y vídeos en otros sitios web
  • Iniciar sesión con tellmelo
  • Lo que esperamos
Contenido

Primeros pasos

  • Quiero …
  • Visión general
  • Inicio rápido
  • Probar
  • Tu clave
  • Lo que puede una clave
  • Bots

Fundamentos

  • Peticiones y respuestas
  • Páginas
  • Solo lo nuevo
  • Límites
  • Cabeceras
  • Cuando algo no funciona
  • Versiones

Rutas

  • Rutas
  • La entrada
    • GET /
  • Publicaciones
    • 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
  • Respuestas
    • 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}
  • Encuestas
    • POST /posts/{id}/vote
  • Perfiles
    • 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
  • Grupos
    • 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
  • Canales
    • GET /communities/{id}/channels
    • GET /channels/{id}/messages
    • POST /channels/{id}/messages
    • POST /channels/{id}/read
    • DELETE /channel-messages/{id}
    • GET /communities/{id}/voice
  • Gestionar grupos
    • 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
  • Descubrir
    • GET /tags
    • GET /search
    • GET /emojis
  • GIF y vídeos
    • GET /media
    • GET /media/mine
    • GET /media/{id}
    • POST /media/uploads
    • PUT /media/uploads/{upload}
    • POST /media/{id}
    • DELETE /media/{id}
  • Tu cuenta
    • 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
  • Notificaciones
    • GET /notifications
    • POST /notifications/read
  • Mensajes
    • 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}
  • Relaciones
    • POST /relations
    • GET /profiles/{handle}/followers
    • GET /profiles/{handle}/following
    • GET /me/relations
  • Colecciones
    • GET /me/collections
    • POST /me/collections
    • PUT /me/collections/{id}
    • DELETE /me/collections/{id}
    • GET /me/collections/{id}/posts
    • POST /me/collections/{id}/posts
  • Regalos
    • GET /partner/quota
    • GET /partner/gifts
    • POST /partner/gifts
    • GET /gift-drops
    • POST /gift-drops

Objetos

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

Más

  • La descripción legible por una máquina
  • GIF y vídeos en otros sitios web
  • Iniciar sesión con tellmelo
  • Lo que esperamos

Quiero …

Elige lo que tienes en mente; debajo están solo los pasos para ello. La referencia completa sigue más abajo.

  1. Crea el bot en uno de tus grupos, en el menú del grupo en «Bots → Mis bots», con imagen, nombre y @nombre. Su token solo lo ves una vez.
  2. Comparte su enlace «Añadir bot» o envíalo al directorio de bots, donde aparece tras la revisión del equipo; quien puede gestionar roles en un grupo lo acepta con los permisos que aprueba.
  3. Recibe lo que ocurre en sus grupos como flujo (GET /v2/events/stream) o en tu dirección, y escribe con POST /v2/channels/{id}/messages. Más en Bots.
  4. Registra comandos (PUT /v2/me/commands) y responde con tarjetas y botones; un bot pone música con un sitio en un canal de voz (POST /v2/channels/{id}/voice).

Visión general

Con v2 tus propios programas hablan con tellmelo: una clave por petición, JSON de vuelta, todas las listas se paginan igual. Rigen las mismas reglas que en la app.

  • Cada ruta empieza por https://api.tellmelo.com/v2.
  • Las peticiones y las respuestas son JSON en UTF-8. Los nombres de campo, los códigos y los valores están en inglés y seguirán así.
  • Una clave actúa como tu cuenta: lo que no puedes ver en la app, tampoco lo puede leer.
https://api.tellmelo.com/v2

Inicio rápido

  1. Crea una clave en «Área de desarrolladores → API» y cópiala. Solo se muestra una vez.
  2. Consulta la raíz con ella. La respuesta indica la versión, los permisos de la clave y las peticiones que quedan este minuto.
  3. Todas las rutas funcionan igual: clave en la cabecera, JSON de vuelta, items y next en las listas.
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"
}

Después: /me para tu perfil, /posts para lo público, /feed para tu feed.

Probar

Elige una tarea, rellena los campos y copia la petición o envíala desde aquí. Escribir pregunta antes. El código lee la clave de TELLMELO_KEY.

read Versión de la API y nombre de esta instancia.

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

Tu clave

Hasta 10 claves por cuenta, cada una con nombre, permisos propios y, si quieres, fecha de caducidad. Una clave empieza por tm_key_ y solo se muestra una vez. ¿La perdiste? Renuévala; el valor antiguo deja de funcionar.

La creas en «Área de desarrolladores → API». Viaja en la cabecera de la petición:

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

O, si te resulta más cómodo, en una cabecera propia:

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

No en la URL: acabaría en registros y en el historial del navegador.

La misma clave carga las imágenes: cada url apunta a /api/media; envía la clave también allí en la cabecera.

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

Lo que puede una clave

Una clave siempre puede leer y, si lo permites, también escribir, regalar, subir medios y gestionar grupos. Cada ruta indica lo que necesita:

  • read: leer. Publicaciones públicas, perfiles, grupos y tags, además de tu feed, tus notificaciones, tus mensajes y los canales de tus grupos.
  • write: actuar. Publicar, responder, votar, enviar mensajes, escribir en el chat de un grupo, seguir, unirse, bloquear, marcar notificaciones como leídas.
  • gifts: regalar. Desde el contingente de un socio a un miembro, y regalos bajo una nueva publicación. Un permiso aparte, para que una clave pensada para publicar nunca pueda regalar nada.
  • media: tu propia biblioteca multimedia. Subir, cambiar, compartir y eliminar GIF y vídeos. Un permiso propio, porque las subidas cuestan puntos de vídeo de la cuenta. Para encontrar GIF y vídeos compartidos basta con read.
  • groups: administrar grupos. Roles, canales, categorías, enlaces de invitación, el canal del feed, las eliminaciones, silencios, expulsiones y vetos, en la medida en que tu cuenta pueda en el grupo. Un permiso propio, para que una clave para publicar nunca cambie quién puede qué en un grupo.

Lo que ninguna clave puede

Ninguna clave llega a la contraseña, la dirección de correo, el tipo de cuenta, el lugar, el rol, la eliminación, las sesiones, los dispositivos de aviso u otras claves, ni a la administración o la gestión de grupos. Lo que protege la contraseña, ninguna clave lo puede.

Bots

Un bot es una cuenta propia, del tipo bot, para grupos: sin contraseña ni correo, controlada por tu programa con su propia clave. Usa la misma API que cualquier cuenta y puede hacer en los grupos lo que su rol allí permita.

  1. En uno de tus grupos, abre el menú del grupo y en «Bots → Mis bots» crea un bot con imagen, portada, nombre, nombre de usuario y descripción. El token solo se muestra una vez; tiene los permisos read, write, media y groups.
  2. Comparte el enlace del bot o envíalo al directorio de bots; aparece allí en cuanto el equipo lo ha revisado. Quien puede gestionar roles en un grupo elige los permisos; el bot se une y recibe un rol propio.
  3. Tu programa envía el token como Authorization: Bearer …, lee los eventos de sus grupos como flujo y trabaja con las rutas de Bots, Canales y Grupos.

Un pequeño bot que lee los eventos como flujo y responde al comando /ping con pong, solo para quien preguntó:

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

El mismo bot en Python, que obtiene los eventos página a página:

# 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)
  • Lo que un bot puede hacer en un grupo lo decide su rol allí, no el token. El rol lleva su nombre; el grupo cambia sus permisos en los roles de los ajustes del grupo y quita el bot en el menú del grupo, en «Bots → En este grupo».
  • Hasta 5 bots por cuenta; por grupo, tantos como permitan sus ventajas. Un bot escribe como máximo 30 mensajes por minuto y grupo, no se encuentra por la búsqueda y solo escribe a quien le escribió primero. Se aplican los límites.
  • Los eventos también llegan a una dirección HTTPS propia (firmados como los webhooks, con reintentos). Además: comandos (PUT /v2/me/commands) con respuestas para todos o solo para quien preguntó, tarjetas y botones en los mensajes, y música en canales de voz (POST /v2/channels/{id}/voice): todo en Bots.

Peticiones y respuestas

  • JSON en todas partes. Cada respuesta es application/json en UTF-8, errores incluidos. Solo las imágenes llegan como imágenes.
  • Lo que envías. Un POST lleva sus campos como JSON en el cuerpo. Si un campo también está en la URL, vale el del cuerpo.
  • Las horas son milisegundos desde el 1 de enero de 1970, UTC.
  • Los ID son cadenas. Compáralos solo enteros.
  • Cada campo está siempre. Lo que falta es null; las listas pueden estar vacías.
  • Los textos son texto plano, tal como se escribieron. Las #etiquetas, los @nombres y los enlaces quedan como están, igual que los emojis propios de la instancia, como :name:; sus imágenes están en /emojis.
  • Las imágenes son direcciones relativas, /api/media?id=…. Sin la clave en la cabecera recibes 401.

Páginas

Cada lista toma limit y cursor y responde con items y next. Devuelve next como cursor para la siguiente página; si next está vacío, has terminado. El cursor es opaco: no lo desmontes ni lo construyas.

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

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

Sin limit, 20 entradas, como máximo 50. Algunas listas no se paginan; su next es siempre null.

Solo lo nuevo

Cada respuesta lleva un ETag. Devuélvelo como If-None-Match la próxima vez: si nada cambió, recibes 304 sin cuerpo.

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

Excepciones: /feed no tiene ETag porque su orden cambia constantemente, y las escrituras nunca responden 304.

Límites

Una clave puede hacer 120 peticiones por minuto, 600 con la suscripción «Organización», salvo que la administración fije otra cosa. Por encima llega 429 y no se ha ejecutado nada. Espera un minuto y vuelve a enviar la petición.

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

Las escrituras cuentan además contra los límites de la app, como cuántas publicaciones en pocos minutos. También responden 429 con rate_limited.

Cabeceras

Aparte de la clave, ninguna cabecera es obligatoria.

Lo que envías

CabeceraSignificado
AuthorizationLleva la clave: Bearer tm_key_…. La forma habitual.
X-Tellmelo-KeyLa clave, como alternativa a Authorization.
Content-Typeapplication/json, para una petición con cuerpo.
If-None-MatchEl ETag de la última respuesta. Si nada ha cambiado desde entonces, la respuesta es 304 sin cuerpo.

Lo que vuelve

CabeceraSignificado
ETagLa huella de esta respuesta (W/). Devuélvela como If-None-Match.
X-RateLimit-LimitCuántas peticiones puede hacer esta clave por minuto.
X-RateLimit-RemainingCuántas quedan en el minuto actual.
X-RateLimit-ResetCuándo empieza el siguiente minuto, en segundos desde 1970, UTC.
X-Tellmelo-ScopeLo que puede hacer esta clave: read o read write.
Retry-AfterCon un 429: cuántos segundos esperar antes de volver a preguntar.
WWW-AuthenticateCon 401 sin clave: Bearer.
Cache-Controlno-store: ningún proxy puede guardar una respuesta. Aun así puedes comprobarla con el ETag.

Cuando algo no funciona

Los errores llegan como JSON: un código fijo en inglés en error para tu programa y una frase en message para personas, con el código de estado correspondiente. Compara solo el código; la frase puede cambiar.

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

Algunos errores traen un campo más: docs con un 401 por falta de clave, limit con un 429.

EstadoCódigoSignificado
400bad_requestLa petición no se puede leer, falta un campo obligatorio o un valor no está permitido.
401key_missingNo hay clave en la cabecera.
401key_invalidLa clave no vale: mal escrita, sustituida o la cuenta está bloqueada.
401unauthorizedRechazada como no identificada, por un motivo distinto de la clave.
403scope_missingA la clave le falta el permiso necesario, normalmente write.
403account_data_lockedLos datos de cuenta como contraseña, correo o eliminación están vetados a las claves.
403forbiddenTu cuenta no puede hacerlo, por ejemplo por un permiso retirado o un bloqueo.
403timed_outUn silencio temporal silencia ahora tu cuenta en este grupo.
404unknown_pathEsta ruta no existe, o no con este método.
404not_foundNo encontrado, o no puedes verlo.
409conflictChoca con algo que ya existe, por ejemplo un nombre ocupado.
409feed_offEl canal del feed de este grupo está desactivado.
413too_largeDemasiado grande para esta instancia.
422unprocessableLegible, pero no posible de esta forma.
429rate_limitedDemasiadas peticiones. No ha pasado nada; espera y vuelve a intentarlo.
500internal_errorAlgo ha fallado en el servidor.

Versiones

La versión está en la ruta. Mientras ponga v2, rutas y campos no cambian; lo nuevo solo se añade.

Las novedades suben el segundo número. Cada ruta indica desde cuándo 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/ ya no existe: las rutas antiguas responden 410 e indican en el cuerpo el nuevo camino.

Rutas

Todas las rutas de un vistazo y luego cada una con un ejemplo.

RutaDerechoPara qué
La entrada
GET/v2readVersión de la API y nombre de esta instancia.
Publicaciones
GET/v2/postsreadLas publicaciones públicas, las más nuevas primero.
GET/v2/posts/{id}readUna sola publicación, por su id.
POST/v2/postswritePublicar una publicación.
DELETE/v2/posts/{id}writeRetirar una publicación tuya.
GET/v2/me/scheduledreadTus publicaciones que aún no han salido, y qué están esperando.
POST/v2/posts/{id}/schedulewriteCambiar cuándo sale una publicación programada, o cuándo se borra sola una publicación.
POST/v2/posts/{id}/editwriteCambiar el texto de una de tus publicaciones.
GET/v2/posts/{id}/reply-settingsreadQuién puede responder a tu publicación, si las respuestas esperan aprobación y el modo lento.
PUT/v2/posts/{id}/reply-settingswriteCambiar los ajustes de respuesta de tu publicación. Lo que no indiques se mantiene.
POST/v2/posts/{id}/coauthorwriteAceptar o rechazar una invitación como coautor.
DELETE/v2/posts/{id}/coauthorwriteRetirarte como coautor o, como autor, quitar al coautor de la publicación.
POST/v2/posts/{id}/pinwriteFijar tu publicación arriba en tu perfil o quitarla.
Respuestas
GET/v2/posts/{id}/repliesreadLas respuestas a una publicación, sin cuentas bloqueadas.
POST/v2/posts/{id}/replieswriteResponder a una publicación.
POST/v2/replies/{id}/editwriteCambiar el texto de una de tus respuestas.
DELETE/v2/replies/{id}writeQuitar una de tus respuestas.
POST/v2/replies/{id}/likewriteVotar a favor de una respuesta (un me gusta es un voto a favor desde que las respuestas se votan) o retirar el voto; un voto en contra se mantiene.
POST/v2/replies/{id}/votewriteVotar una respuesta a favor o en contra, o retirar tu voto. Responde con tu voto y la puntuación resultante.
POST/v2/replies/{id}/pickwriteDestacar una respuesta bajo tu propia publicación como la mejor, o quitar el destacado.
GET/v2/posts/{id}/replies/waitingreadLas respuestas que esperan aprobación bajo una publicación: todas bajo la tuya, si no solo las tuyas.
POST/v2/replies/{id}/decidewriteAprobar o rechazar una respuesta en espera bajo tu publicación. Si la rechazas, se borra.
GET/v2/posts/{id}/replies/plannedreadTus respuestas programadas para más tarde bajo una publicación.
PUT/v2/me/planned-replies/{id}writeCambiar el texto o la hora de una respuesta programada. Si había fallado, vuelve a esperar.
POST/v2/me/planned-replies/{id}/sendwriteEnviar ya una respuesta programada.
DELETE/v2/me/planned-replies/{id}writeBorrar una respuesta programada.
Encuestas
POST/v2/posts/{id}/votewriteParticipar en una encuesta.
Perfiles
GET/v2/profiles/{handle}readUn perfil, por su alias.
GET/v2/profiles/{handle}/postsreadLas publicaciones públicas de un perfil, las más nuevas primero.
GET/v2/profiles/{handle}/eventsreadLos próximos eventos de un perfil, los más cercanos primero.
POST/v2/me/eventswriteCrear un evento. Responde con su id.
PUT/v2/me/events/{id}writeCambiar uno de tus eventos. Todos los campos se fijan de nuevo.
DELETE/v2/me/events/{id}writeBorrar uno de tus eventos.
GET/v2/me/events/{id}/signupsreadQuién se ha apuntado a uno de tus eventos.
POST/v2/events/{id}/signupwriteApuntarte a un evento o darte de baja.
Grupos
GET/v2/communitiesreadLos grupos abiertos de esta instancia; con mine=true, los grupos de tu cuenta.
GET/v2/communities/{id}readUn solo grupo, por su id.
GET/v2/communities/{id}/postsreadLas publicaciones del canal del feed de un grupo, las más recientes primero.
GET/v2/communities/{id}/membersreadLos miembros de un grupo con sus roles.
GET/v2/communities/{id}/rolesreadLos roles de un grupo, el más alto primero, @everyone al final.
GET/v2/communities/{id}/bellreadQué notificaciones te envía un grupo.
GET/v2/invites/{code}readEl grupo detrás de un enlace de invitación, antes de unirse.
PUT/v2/roles/{id}/selfwriteTomar o dejar un rol elegible.
GET/v2/communities/{id}/emojisreadLos emojis propios de un grupo.
PUT/v2/communities/{id}/bellwriteAjustar qué notificaciones te envía un grupo.
POST/v2/invites/{code}/joinwriteUnirse a un grupo con un enlace de invitación.
GET/v2/communities/{id}/botsreadLos bots de un grupo con lo que permite su rol.
Canales
GET/v2/communities/{id}/channelsreadLos canales de un grupo que ves, en su orden.
GET/v2/channels/{id}/messagesreadLos mensajes de un canal de chat, los más recientes primero.
POST/v2/channels/{id}/messageswriteEscribir un mensaje en un canal de chat.
POST/v2/channels/{id}/readwriteMarcar un canal de chat como leído hasta un momento.
DELETE/v2/channel-messages/{id}writeBorrar uno de tus mensajes en un canal de chat.
GET/v2/communities/{id}/voicereadQuién está ahora en los canales de voz de un grupo, por canal.
Gestionar grupos
POST/v2/communities/{id}/emojisgroupsDar un emoji al grupo.
DELETE/v2/communities/{id}/emojis/{name}groupsQuitar un emoji del grupo.
POST/v2/communities/{id}/rolesgroupsCrear un rol.
PUT/v2/roles/{id}groupsCambiar el nombre, el color y los permisos de un rol.
DELETE/v2/roles/{id}groupsBorrar un rol.
PUT/v2/communities/{id}/roles/ordergroupsFijar el rango de los roles.
PUT/v2/roles/{id}/members/{member}groupsDar o quitar un rol a un miembro.
POST/v2/communities/{id}/channelsgroupsCrear un canal de chat.
PUT/v2/channels/{id}groupsCambiar el nombre, el tema y la categoría de un canal.
DELETE/v2/channels/{id}groupsBorrar un canal de chat con sus mensajes.
PUT/v2/communities/{id}/channels/ordergroupsFijar el orden de las categorías y los canales de chat.
PUT/v2/communities/{id}/channels/shapegroupsFijar la forma de todos los símbolos de canal del grupo.
GET/v2/channels/{id}/overridesgroupsLo que los roles pueden hacer distinto en un canal que en el grupo.
PUT/v2/channels/{id}/overrides/{role}groupsFijar lo que un rol puede hacer distinto en un canal.
POST/v2/communities/{id}/categoriesgroupsCrear una categoría para canales.
PUT/v2/categories/{id}groupsRenombrar una categoría.
DELETE/v2/categories/{id}groupsBorrar una categoría.
PUT/v2/communities/{id}/feedgroupsActivar o desactivar el canal del feed de un grupo.
GET/v2/communities/{id}/invitesgroupsLos enlaces de invitación de un grupo que siguen valiendo.
POST/v2/communities/{id}/invitesgroupsCrear un enlace de invitación.
DELETE/v2/invites/{code}groupsRetirar un enlace de invitación.
POST/v2/channel-messages/{id}/removegroupsQuitar de un canal el mensaje de otro miembro.
POST/v2/communities/{id}/posts/{post}/removegroupsQuitar una publicación de un grupo.
DELETE/v2/communities/{id}/members/{member}groupsExpulsar a un miembro de un grupo.
PUT/v2/communities/{id}/members/{member}/timeoutgroupsSilenciar a un miembro.
DELETE/v2/communities/{id}/members/{member}/timeoutgroupsQuitar un silencio.
GET/v2/communities/{id}/bansgroupsLos vetos vigentes de un grupo.
PUT/v2/communities/{id}/bans/{member}groupsVetar a un miembro.
DELETE/v2/communities/{id}/bans/{member}groupsLevantar un veto.
GET/v2/communities/{id}/loggroupsEl registro de la dirección: quién quitó qué y por qué.
POST/v2/communitiesgroupsFundar un grupo. Responde con su id; tú eres el fundador.
PUT/v2/communities/{id}groupsCambiar un grupo que diriges. Lo que no indiques se mantiene.
Bots
GET/v2/eventsreadLos eventos de los grupos del bot desde un evento, página a página.
GET/v2/events/streamreadLos eventos de los grupos del bot en cuanto ocurren (server-sent events).
GET/v2/me/commandsreadLos comandos del bot.
PUT/v2/me/commandswriteDefinir los comandos del bot, todos a la vez.
POST/v2/interactions/{id}/replywriteResponder a un comando o a un botón.
POST/v2/channels/{id}/voicewriteOcupar un sitio en un canal de voz para reproducir música o sonido.
Descubrir
GET/v2/tagsreadLas etiquetas que están en marcha ahora mismo.
GET/v2/searchreadUna búsqueda por publicaciones, nombres, alias y etiquetas.
GET/v2/emojisreadLos emojis propios de la instancia, con la dirección de sus imágenes.
GIF y vídeos
GET/v2/mediareadGIF o vídeos compartidos, los más usados primero.
GET/v2/media/minemediaTu propia biblioteca multimedia, lo más nuevo primero.
GET/v2/media/{id}readUn GIF o vídeo, tuyo o compartido.
POST/v2/media/uploadsmediaIniciar una subida.
PUT/v2/media/uploads/{upload}mediaEnviar un fragmento del archivo.
POST/v2/media/{id}mediaCambiar uno de tus GIF o vídeos.
DELETE/v2/media/{id}mediaEliminar uno de tus GIF o vídeos.
Tu cuenta
GET/v2/mereadTu propio perfil, con el id que esperan las demás rutas.
GET/v2/feedreadTu propio feed, tal como lo compone la aplicación.
POST/v2/me/pictureswriteSubir una imagen, como sus bytes. Responde con id y url; luego usas la id como foto de perfil, portada o en una publicación.
PUT/v2/me/profileprofileCambiar tu perfil: nombre, sobre ti, foto de perfil, portada y color del perfil. Lo que no indiques se mantiene.
GET/v2/me/emojisreadTus propios emojis.
POST/v2/me/emojis/picturesprofileSubir la imagen de un emoji propio, como sus bytes.
POST/v2/me/emojisprofileCrear un emoji propio. Responde con todos tus emojis.
DELETE/v2/me/emojis/{name}profileQuitar un emoji propio. Responde con los demás.
PUT/v2/me/emojis/sharingprofileDecidir si tus seguidores pueden usar tus emojis en sus propios textos.
GET/v2/me/webhookswebhooksTus webhooks con su estado.
POST/v2/me/webhookswebhooksCrear un webhook. Responde con la id y el secreto para las firmas, solo esta vez.
DELETE/v2/me/webhooks/{id}webhooksBorrar un webhook.
POST/v2/me/webhooks/{id}/testwebhooksEnviar una prueba a un webhook.
Notificaciones
GET/v2/notificationsreadTus notificaciones, las más nuevas primero.
POST/v2/notifications/readwriteMarcar tus notificaciones como leídas.
Mensajes
GET/v2/conversationsreadTu buzón: una fila por conversación, la más reciente primero.
GET/v2/conversations/{with}/messagesreadLos mensajes de una conversación, los más nuevos primero.
POST/v2/conversations/{with}/messageswriteEnviar un mensaje en una conversación.
POST/v2/conversations/{with}/readwriteMarcar como leídos todos los mensajes de una conversación.
DELETE/v2/conversations/{with}/messages/{id}writeBorrar uno de tus mensajes.
POST/v2/conversations/{with}/plannedwriteProgramar un mensaje para más tarde. Responde con la id del mensaje programado.
GET/v2/me/planned-messagesreadTus mensajes que aún se van a enviar, por orden de hora.
POST/v2/me/planned-messages/{id}/sendwriteEnviar ahora un mensaje programado retenido o fallido.
DELETE/v2/me/planned-messages/{id}writeBorrar un mensaje programado antes de que se envíe.
Relaciones
POST/v2/relationswriteDar me gusta, guardar, compartir, seguir, unirse, bloquear, silenciar, según kind.
GET/v2/profiles/{handle}/followersreadQuién sigue a un perfil, los más recientes primero.
GET/v2/profiles/{handle}/followingreadA quién sigue un perfil, los más recientes primero.
GET/v2/me/relationsreadA quién has bloqueado, silenciado o bloqueado solo para mensajes, los más recientes primero.
Colecciones
GET/v2/me/collectionsreadTus colecciones con el número de publicaciones.
POST/v2/me/collectionswriteCrear una colección. Responde con su id.
PUT/v2/me/collections/{id}writeCambiar el nombre de una colección.
DELETE/v2/me/collections/{id}writeBorrar una colección.
GET/v2/me/collections/{id}/postsreadLas publicaciones de una colección, como en la pestaña de guardados.
POST/v2/me/collections/{id}/postswriteMeter una publicación en una colección o sacarla.
Regalos
GET/v2/partner/quotareadLo que te queda por regalar en tu contingente.
GET/v2/partner/giftsreadLo que has regalado de tu contingente, a quién y cuándo, lo más reciente primero.
POST/v2/partner/giftsgiftsRegalar meses de suscripción o chispas de tu contingente a un miembro.
GET/v2/gift-dropsreadTus regalos bajo publicaciones: cuántas plazas siguen libres y cómo se pagaron.
POST/v2/gift-dropsgiftsPublicar una publicación con regalos para que otros los recojan.

La entrada

La primera petición de todo programa: ¿funciona la clave y qué puede hacer?

GET/v2

Versión de la API y nombre de esta instancia.

  • Derecho read
  • con ETag
  • desde v2.0

Sin barra al final: https://api.tellmelo.com/v2/ redirige a https://api.tellmelo.com/v2 con 308, y no todos los programas lo siguen.

Petición de ejemplo

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

Respuesta

Responde con un Service.

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

Estados posibles: 200304401429

Publicaciones

Leer publicaciones públicas, publicar las tuyas y volver a quitarlas.

GET/v2/posts

Las publicaciones públicas, las más nuevas primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

En las rutas públicas, counts.likes y counts.reposts son siempre 0 y pinned es false.

Las publicaciones de grupos no están aquí, sino en /communities/{id}/posts.

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Post, como `items` y `next`.

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

Estados posibles: 200304401429

GET/v2/posts/{id}

Una sola publicación, por su id.

  • Derecho read
  • con ETag
  • desde v2.0

En las rutas públicas, counts.likes y counts.reposts son siempre 0 y pinned es false.

Las publicaciones de grupos no están aquí, sino en /communities/{id}/posts.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con un Post.

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

Estados posibles: 200304400401404429

POST/v2/posts

Publicar una publicación.

  • Derecho write
  • desde v2.0

Una publicación necesita texto o una encuesta. La longitud, las opciones y el ritmo los fija la instancia; si se superan, llega 400 o 429.

Adjunta imágenes, un GIF o un vídeo con media. Un GIF o vídeo va solo. Puedes usar en tellmelo los GIF y vídeos compartidos de otros.

Una publicación para amigos cercanos o con coautor sale de inmediato, no en un grupo ni programada. No se pueden combinar ambas.

Parámetros

NombreTipoSignificado
texten el cuerpostringopcionalEl texto de la publicación, la respuesta o el mensaje.
communityen el cuerpostringopcionalEl id del grupo a cuyo canal del feed va la publicación; debe estar activado y necesitas el permiso. Sin él, la publicación queda fuera de cualquier grupo.
quotesen el cuerpostringopcionalEl id de la publicación que esta cita.
pollen el cuerpostring[]opcionalLas opciones como lista de textos.
mediaen el cuerpostring[]opcionalIDs de imágenes subidas en la app, o de un GIF o vídeo de la biblioteca multimedia (desde 2.14).
audienceen el cuerpostringopcionalQuién ve la publicación: everyone todos los que pueden verla, close solo tus amigos cercanos.everyoneclose
coauthoren el cuerpostringopcionalLa id de una cuenta que invitas como coautor. Tenéis que seguiros mutuamente.

Petición de ejemplo

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"

Respuesta

Responde con un Created.

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

Estados posibles: 200400401403429

DELETE/v2/posts/{id}

Retirar una publicación tuya.

  • Derecho write
  • desde v2.0

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/me/scheduled

Tus publicaciones que aún no han salido, y qué están esperando.

  • Derecho read
  • con ETag
  • desde v2.12

Petición de ejemplo

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

Respuesta

Responde con una página de ScheduledPost, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/posts/{id}/schedule

Cambiar cuándo sale una publicación programada, o cuándo se borra sola una publicación.

  • Derecho write
  • desde v2.12

Solo tus propias publicaciones. Mientras los regalos de una publicación no estén pagados, no se puede programar.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
publishAten el cuerpointegeropcionalCuándo sale la publicación programada, en milisegundos desde 1970.
deleteAten el cuerpointegeropcionalCuándo se borra sola la publicación, en milisegundos desde 1970.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/posts/{id}/edit

Cambiar el texto de una de tus publicaciones.

  • Derecho write
  • desde v2.12

Solo dentro del tiempo de edición que te da tu suscripción. Las publicaciones programadas no se pueden editar.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
texten el cuerpostringobligatorioEl texto de la publicación, la respuesta o el mensaje.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Quién puede responder a tu publicación, si las respuestas esperan aprobación y el modo lento.

  • Derecho read
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con un ReplySettings.

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

Estados posibles: 200304400401404429

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

Cambiar los ajustes de respuesta de tu publicación. Lo que no indiques se mantiene.

  • Derecho write
  • desde v2.19

Solo tus propias publicaciones.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
audienceen el cuerpostringopcionalQuién puede responder: todos, cuentas que sigues, las mencionadas o nadie.allfollowingmentionednobody
approvalen el cuerpobooleanopcionalSi las respuestas solo aparecen después de que las apruebes.
slowen el cuerpostringopcionalModo lento: auto se activa solo cuando llegan muchas respuestas, on siempre, off nunca.autoonoff

Petición de ejemplo

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"

Respuesta

Responde con un ReplySettings.

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

Estados posibles: 200400401403404429

POST/v2/posts/{id}/coauthor

Aceptar o rechazar una invitación como coautor.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
accepten el cuerpobooleanobligatoriotrue acepta la invitación, false la rechaza.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

DELETE/v2/posts/{id}/coauthor

Retirarte como coautor o, como autor, quitar al coautor de la publicación.

  • Derecho write
  • desde v2.19

Para el coautor y el autor de la publicación.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/posts/{id}/pin

Fijar tu publicación arriba en tu perfil o quitarla.

  • Derecho write
  • desde v2.19

Solo tus publicaciones visibles. Cuántas puedes fijar depende de tu suscripción.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
activeen el cuerpobooleanobligatoriotrue fija la publicación, false la quita.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Respuestas

Respuestas bajo una publicación, como lista con parentId.

GET/v2/posts/{id}/replies

Las respuestas a una publicación, sin cuentas bloqueadas.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

La lista es plana y en orden de escritura; parentId la convierte en árbol. Una página siempre contiene hilos enteros. Faltan las respuestas de cuentas bloqueadas.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Reply, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/posts/{id}/replies

Responder a una publicación.

  • Derecho write
  • desde v2.0

En modo lento, una respuesta por persona cada 10 minutos; si no, 429. El autor y las cuentas que sigue quedan exentos.

Con media, como máximo una imagen, un GIF o un vídeo.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
texten el cuerpostringobligatorioEl texto de la publicación, la respuesta o el mensaje.
parentIden el cuerpostringopcionalEl id de la respuesta a la que esta responde. Sin él, directo a la publicación.
mediaen el cuerpostring[]opcionalIDs de imágenes subidas en la app, o de un GIF o vídeo de la biblioteca multimedia (desde 2.14).
publishAten el cuerpointegeropcionalCuándo debe salir la respuesta, en milisegundos desde 1970. Sin ella sale de inmediato.

Petición de ejemplo

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"

Respuesta

Responde con un Created.

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

Estados posibles: 200400401403404429

POST/v2/replies/{id}/edit

Cambiar el texto de una de tus respuestas.

  • Derecho write
  • desde v2.12

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.
texten el cuerpostringobligatorioEl texto de la publicación, la respuesta o el mensaje.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

DELETE/v2/replies/{id}

Quitar una de tus respuestas.

  • Derecho write
  • desde v2.12

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/replies/{id}/like

Votar a favor de una respuesta (un me gusta es un voto a favor desde que las respuestas se votan) o retirar el voto; un voto en contra se mantiene.

  • Derecho write
  • desde v2.12
  • obsoleta

Obsoleta desde 2.19: usa POST /replies/{id}/vote. Esta ruta se mantiene por ahora.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.
activeen el cuerpobooleanobligatoriotrue la establece, false la retira.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/replies/{id}/vote

Votar una respuesta a favor o en contra, o retirar tu voto. Responde con tu voto y la puntuación resultante.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.
voteen el cuerpostringobligatorioup vota a favor, down en contra, none retira tu voto.updownnone

Petición de ejemplo

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"

Respuesta

Responde con un ReplyVote.

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

Estados posibles: 200400401403404429

POST/v2/replies/{id}/pick

Destacar una respuesta bajo tu propia publicación como la mejor, o quitar el destacado.

  • Derecho write
  • desde v2.19

Solo bajo tus propias publicaciones y solo respuestas directas a la publicación. Un nuevo destacado sustituye al anterior.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.
activeen el cuerpobooleanobligatoriotrue destaca la respuesta, false quita el destacado.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Las respuestas que esperan aprobación bajo una publicación: todas bajo la tuya, si no solo las tuyas.

  • Derecho read
  • con ETag
  • desde v2.19

Si las respuestas esperan lo decide el autor en los ajustes de respuesta.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con una página de Reply, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/replies/{id}/decide

Aprobar o rechazar una respuesta en espera bajo tu publicación. Si la rechazas, se borra.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl identificador de la respuesta.
approveen el cuerpobooleanobligatoriotrue aprueba la respuesta, false la rechaza.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Tus respuestas programadas para más tarde bajo una publicación.

  • Derecho read
  • con ETag
  • desde v2.19

Se programa con publishAt al responder. Como máximo 20 respuestas programadas a la vez.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.

Petición de ejemplo

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

Respuesta

Responde con una página de PlannedReply, como `items` y `next`.

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

Estados posibles: 200304400401404429

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

Cambiar el texto o la hora de una respuesta programada. Si había fallado, vuelve a esperar.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la respuesta programada.
texten el cuerpostringopcionalEl texto de la publicación, la respuesta o el mensaje.
publishAten el cuerpointegeropcionalCuándo debe salir la respuesta, en milisegundos desde 1970. Sin ella sale de inmediato.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Enviar ya una respuesta programada.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la respuesta programada.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Borrar una respuesta programada.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la respuesta programada.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Encuestas

Una encuesta es una publicación con poll rellenado. Votar tiene su propia ruta.

POST/v2/posts/{id}/vote

Participar en una encuesta.

  • Derecho write
  • desde v2.0

Los votos por opción son null hasta que votes o termine la encuesta. total está siempre.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una publicación.
optionen el cuerpointegerobligatorioQué opción, contando desde 0. Con varias opciones, una llamada por opción.
retracten el cuerpobooleanopcionaltrue retira el voto.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Perfiles

Perfiles públicos por su nombre corto, y lo que han publicado.

GET/v2/profiles/{handle}

Un perfil, por su alias.

  • Derecho read
  • con ETag
  • desde v2.0

Parámetros

NombreTipoSignificado
handleen la rutastringobligatorioEl alias de un perfil, con mayúsculas o minúsculas, da igual.

Petición de ejemplo

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

Respuesta

Responde con un Profile.

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

Estados posibles: 200304400401404429

GET/v2/profiles/{handle}/posts

Las publicaciones públicas de un perfil, las más nuevas primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

En las rutas públicas, counts.likes y counts.reposts son siempre 0 y pinned es false.

Las publicaciones de grupos no están aquí, sino en /communities/{id}/posts.

Parámetros

NombreTipoSignificado
handleen la rutastringobligatorioEl alias de un perfil, con mayúsculas o minúsculas, da igual.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Post, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/profiles/{handle}/events

Los próximos eventos de un perfil, los más cercanos primero.

  • Derecho read
  • con ETag
  • desde v2.19

Solo mientras la suscripción del perfil incluya eventos. Nada entre cuentas que se han bloqueado.

Parámetros

NombreTipoSignificado
handleen la rutastringobligatorioEl alias de un perfil, con mayúsculas o minúsculas, da igual.

Petición de ejemplo

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

Respuesta

Responde con una página de Event, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/me/events

Crear un evento. Responde con su id.

  • Derecho write
  • desde v2.19

Necesita una suscripción con eventos, si no 403. Cuántos pueden estar pendientes depende de la suscripción.

Parámetros

NombreTipoSignificado
titleen el cuerpostringobligatorioEl título.
startsAten el cuerpointegerobligatorioInicio, en milisegundos desde 1970.
endsAten el cuerpointegeropcionalFin, en milisegundos desde 1970. Opcional.
placeen el cuerpostringopcionalDónde tiene lugar.
descriptionen el cuerpostringopcionalUna descripción.
signupsen el cuerpobooleanopcionalSi la gente puede apuntarse. Necesita una suscripción con inscripciones.
capacityen el cuerpointegeropcionalCuántas personas pueden apuntarse como máximo. Sin indicarlo, sin límite.

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403429

PUT/v2/me/events/{id}

Cambiar uno de tus eventos. Todos los campos se fijan de nuevo.

  • Derecho write
  • desde v2.19

Un evento que ya ha empezado conserva su inicio.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del evento.
titleen el cuerpostringobligatorioEl título.
startsAten el cuerpointegerobligatorioInicio, en milisegundos desde 1970.
endsAten el cuerpointegeropcionalFin, en milisegundos desde 1970. Opcional.
placeen el cuerpostringopcionalDónde tiene lugar.
descriptionen el cuerpostringopcionalUna descripción.
signupsen el cuerpobooleanopcionalSi la gente puede apuntarse. Necesita una suscripción con inscripciones.
capacityen el cuerpointegeropcionalCuántas personas pueden apuntarse como máximo. Sin indicarlo, sin límite.

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

DELETE/v2/me/events/{id}

Borrar uno de tus eventos.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del evento.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Quién se ha apuntado a uno de tus eventos.

  • Derecho read
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del evento.

Petición de ejemplo

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

Respuesta

Responde con una página de EventSignup, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/events/{id}/signup

Apuntarte a un evento o darte de baja.

  • Derecho write
  • desde v2.19

Solo en eventos con inscripción, no en los tuyos. Si está lleno, 409.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del evento.
goingen el cuerpobooleanobligatoriotrue te apunta, false te da de baja.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Grupos

Los grupos abiertos y los tuyos, sus publicaciones, miembros, roles y enlaces de invitación.

GET/v2/communities

Los grupos abiertos de esta instancia; con mine=true, los grupos de tu cuenta.

  • Derecho read
  • con ETag
  • desde v2.0

Ordenada por número de miembros y sin paginar; next es siempre null.

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
mineen la direcciónbooleanopcionaltrue para los grupos de tu cuenta, también internos y ocultos, por nombre.

Petición de ejemplo

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

Respuesta

Responde con una página de Community, como `items` y `next`.

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

Estados posibles: 200304401429

GET/v2/communities/{id}

Un solo grupo, por su id.

  • Derecho read
  • con ETag
  • desde v2.0

Los grupos internos y ocultos solo si tu cuenta es miembro.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con un Community.

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

Estados posibles: 200304400401404429

GET/v2/communities/{id}/posts

Las publicaciones del canal del feed de un grupo, las más recientes primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

En las rutas públicas, counts.likes y counts.reposts son siempre 0 y pinned es false.

Si el canal del feed está desactivado, la ruta responde 409 con feed_off.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Post, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/communities/{id}/members

Los miembros de un grupo con sus roles.

  • Derecho read
  • con ETag
  • desde v2.15

Primero la dirección, luego por el rol más alto; como mucho 300.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de GroupMember, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/communities/{id}/roles

Los roles de un grupo, el más alto primero, @everyone al final.

  • Derecho read
  • con ETag
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de Role, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/communities/{id}/bell

Qué notificaciones te envía un grupo.

  • Derecho read
  • con ETag
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con un Bell.

Ejemplo
{
  "level": "important"
}

Estados posibles: 200304400401404429

GET/v2/invites/{code}

El grupo detrás de un enlace de invitación, antes de unirse.

  • Derecho read
  • con ETag
  • desde v2.15

Parámetros

NombreTipoSignificado
codeen la rutastringobligatorioEl código de un enlace de invitación, el final de su dirección.

Petición de ejemplo

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

Respuesta

Responde con un InvitePreview.

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

Estados posibles: 200304400401404429

PUT/v2/roles/{id}/self

Tomar o dejar un rol elegible.

  • Derecho write
  • desde v2.20

Solo roles que la dirección ofrece como elegibles (selfable), y solo para tu propia cuenta.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un rol.
activeen el cuerpobooleanopcionalfalse quita el rol; si no, se da.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/communities/{id}/emojis

Los emojis propios de un grupo.

  • Derecho read
  • con ETag
  • desde v2.20

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de GroupEmoji, como `items` y `next`.

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

Estados posibles: 200304400401404429

PUT/v2/communities/{id}/bell

Ajustar qué notificaciones te envía un grupo.

  • Derecho write
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
levelen el cuerpostringobligatorioQué notificaciones llegan.allimportantoff

Petición de ejemplo

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"

Respuesta

Responde con un Bell.

Ejemplo
{
  "level": "important"
}

Estados posibles: 200400401403404429

POST/v2/invites/{code}/join

Unirse a un grupo con un enlace de invitación.

  • Derecho write
  • desde v2.15

Parámetros

NombreTipoSignificado
codeen la rutastringobligatorioEl código de un enlace de invitación, el final de su dirección.
rulesen el cuerpobooleanopcionaltrue si aceptas las normas del grupo; necesario si tiene.

Petición de ejemplo

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

Respuesta

Responde con un Joined.

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

Estados posibles: 200400401403404429

GET/v2/communities/{id}/bots

Los bots de un grupo con lo que permite su rol.

  • Derecho read
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de GroupBot, como `items` y `next`.

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

Estados posibles: 200304400401404429

Canales

Los canales de tus grupos y su chat: leer, escribir, marcar como leído.

GET/v2/communities/{id}/channels

Los canales de un grupo que ves, en su orden.

  • Derecho read
  • con ETag
  • desde v2.15

El canal del feed (kind: feed) solo aparece aquí mientras está activado; sus publicaciones llegan por /communities/{id}/posts.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de Channel, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/channels/{id}/messages

Los mensajes de un canal de chat, los más recientes primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.15

Hasta 50 mensajes por página. Faltan los mensajes de cuentas que bloqueaste o que te bloquearon.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.
threaden la direcciónstringopcionalEl mensaje cuyo hilo se lee: él y sus respuestas en lugar del chat.

Petición de ejemplo

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

Respuesta

Responde con una página de ChannelMessage, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/channels/{id}/messages

Escribir un mensaje en un canal de chat.

  • Derecho write
  • desde v2.15

@nombre avisa a un miembro, @everyone con el permiso a todos, como mucho seis veces por hora.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.
texten el cuerpostringopcionalEl texto de la publicación, la respuesta o el mensaje.
replyToen el cuerpostringopcionalEl id del mensaje del mismo canal al que respondes.
mediaen el cuerpostring[]opcionalIDs de imágenes subidas en la app, o de un GIF o vídeo de la biblioteca multimedia (desde 2.14).
threaden el cuerpostringopcionalEl mensaje del chat en cuyo hilo se responde; sin él, el mensaje va al chat.
carden el cuerpoobjectopcionalUna tarjeta { title, text, color, fields: [{ name, value }] }, como máximo 10 campos.
buttonsen el cuerpoobject[]opcionalHasta 5 botones, cada uno { id, label, style } con style primary, secondary o danger. Una pulsación llega como evento interaction.

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

POST/v2/channels/{id}/read

Marcar un canal de chat como leído hasta un momento.

  • Derecho write
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.
aten el cuerpointegerobligatorioHasta cuándo está leído, en milisegundos, normalmente el createdAt del mensaje más reciente.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

DELETE/v2/channel-messages/{id}

Borrar uno de tus mensajes en un canal de chat.

  • Derecho write
  • desde v2.15

Solo tus propios mensajes; los de otros los quita la dirección con el permiso groups.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un mensaje en un canal de chat.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/communities/{id}/voice

Quién está ahora en los canales de voz de un grupo, por canal.

  • Derecho read
  • con ETag
  • desde v2.19

Solo canales que puedes ver. Sin servidor de medios, la lista está vacía.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de VoiceRoom, como `items` y `next`.

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

Estados posibles: 200304400401404429

Gestionar grupos

Lo que permiten los ajustes de un grupo en la app, con el permiso groups. Lo que puede tu cuenta lo decide el grupo como en la app: dirección, roles y su rango.

POST/v2/communities/{id}/emojis

Dar un emoji al grupo.

  • Derecho groups
  • desde v2.20

Solo quien puede gestionar los canales del grupo. La imagen se sube como un emoji propio (POST /me/emojis/pictures); un nombre solo existe una vez entre todos los emojis.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen el cuerpostringobligatorioEl nombre con el que escribes el emoji, como :nombre:.
pictureen el cuerpostringobligatorioLa id de POST /me/emojis/pictures.

Petición de ejemplo

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"

Respuesta

Responde con una página de GroupEmoji, como `items` y `next`.

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

Estados posibles: 200400401403404429

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

Quitar un emoji del grupo.

  • Derecho groups
  • desde v2.20

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen la rutastringobligatorioEl nombre del emoji, sin dos puntos.

Petición de ejemplo

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

Respuesta

Responde con una página de GroupEmoji, como `items` y `next`.

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

Estados posibles: 200400401403404429

POST/v2/communities/{id}/roles

Crear un rol.

  • Derecho groups
  • desde v2.15

Solo roles por debajo de tu rol más alto y solo permisos que tienes tú; la dirección está por encima de todos.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen el cuerpostringopcionalEl nombre del rol; @everyone conserva el suyo.
coloren el cuerpostringopcionalEl color; vacío para ninguno.indigovioletroseambergreenteal
permissionsen el cuerpostring[]opcionalLos permisos: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableen el cuerpobooleanopcionaltrue: los miembros toman el rol por sí mismos. Solo para roles que no permiten más que participar (view, send, attach, voice_connect, voice_speak, voice_video).

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

PUT/v2/roles/{id}

Cambiar el nombre, el color y los permisos de un rol.

  • Derecho groups
  • desde v2.15

Sustituye nombre, color y permisos; lo que omitas queda vacío.

Solo roles por debajo de tu rol más alto y solo permisos que tienes tú; la dirección está por encima de todos.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un rol.
nameen el cuerpostringopcionalEl nombre del rol; @everyone conserva el suyo.
coloren el cuerpostringopcionalEl color; vacío para ninguno.indigovioletroseambergreenteal
permissionsen el cuerpostring[]opcionalLos permisos: view, send, attach, post_feed, invite, mention_everyone, moderate, timeout_members, kick_members, ban_members, manage_channels, manage_roles.
selfableen el cuerpobooleanopcionaltrue: los miembros toman el rol por sí mismos. Solo para roles que no permiten más que participar (view, send, attach, voice_connect, voice_speak, voice_video).

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

DELETE/v2/roles/{id}

Borrar un rol.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un rol.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Fijar el rango de los roles.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
rolesen el cuerpostring[]obligatorioLos id de todos los roles por debajo de tu rol más alto, el más alto primero; para la dirección, todos excepto @everyone.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Dar o quitar un rol a un miembro.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un rol.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.
activeen el cuerpobooleanopcionalfalse quita el rol; si no, se da.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/communities/{id}/channels

Crear un canal de chat.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen el cuerpostringopcionalEl nombre, sin #; vacío para el nombre que la app da en cada idioma.
topicen el cuerpostringopcionalEl tema que aparece encima del canal.
categoryen el cuerpostringopcionalEl id de la categoría donde va el canal; vacío para ninguna.
emojien el cuerpostringopcionalUn emoji como símbolo.
iconen el cuerpostringopcionalUn símbolo del conjunto de la app, por su nombre.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageen el cuerpostringopcionalEl id de una imagen que subiste con /media/emoji.
coloren el cuerpostringopcionalEl color del recuadro.brandindigovioletroseambergreentealred
shapeen el cuerpostringopcionalLa forma del recuadro; sin ella, un círculo.circlesquaretrianglediamondhexagonoctagonshieldstar

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

PUT/v2/channels/{id}

Cambiar el nombre, el tema y la categoría de un canal.

  • Derecho groups
  • desde v2.15

Sustituye nombre, tema y categoría; lo que omitas queda vacío.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.
nameen el cuerpostringopcionalEl nombre, sin #; vacío para el nombre que la app da en cada idioma.
topicen el cuerpostringopcionalEl tema que aparece encima del canal.
categoryen el cuerpostringopcionalEl id de la categoría donde va el canal; vacío para ninguna.
emojien el cuerpostringopcionalUn emoji como símbolo.
iconen el cuerpostringopcionalUn símbolo del conjunto de la app, por su nombre.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageen el cuerpostringopcionalEl id de una imagen que subiste con /media/emoji.
coloren el cuerpostringopcionalEl color del recuadro.brandindigovioletroseambergreentealred
shapeen el cuerpostringopcionalLa forma del recuadro; sin ella, un círculo.circlesquaretrianglediamondhexagonoctagonshieldstar

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

DELETE/v2/channels/{id}

Borrar un canal de chat con sus mensajes.

  • Derecho groups
  • desde v2.15

El canal del feed no se puede borrar, solo desactivar.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Fijar el orden de las categorías y los canales de chat.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
categoriesen el cuerpostring[]obligatorioLos id de todas las categorías del grupo en el nuevo orden.
channelsen el cuerpostring[]obligatorioLos id de todos los canales de chat del grupo en el nuevo orden.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Fijar la forma de todos los símbolos de canal del grupo.

  • Derecho groups
  • desde v2.20

Solo la dirección del grupo.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
shapeen el cuerpostringopcionalLa forma de todos los símbolos del grupo; si se omite, cada canal tiene la suya.circlesquaretrianglediamondhexagonoctagonshieldstar

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/channels/{id}/overrides

Lo que los roles pueden hacer distinto en un canal que en el grupo.

  • Derecho groups
  • con ETag
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.

Petición de ejemplo

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

Respuesta

Responde con una página de ChannelOverride, como `items` y `next`.

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

Estados posibles: 200304400401403404429

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

Fijar lo que un rol puede hacer distinto en un canal.

  • Derecho groups
  • desde v2.15

No para roles iguales o superiores a tu rol más alto.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.
roleen la rutastringobligatorioEl id de un rol.
allowen el cuerpostring[]opcionalLo que el rol puede hacer aquí además: en un chat view, send, attach, mention_everyone, moderate, en el canal del feed view y post_feed.
denyen el cuerpostring[]opcionalLo que el rol no puede aquí, de los mismos permisos. Ambas listas vacías quitan la diferencia.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/communities/{id}/categories

Crear una categoría para canales.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen el cuerpostringobligatorioEl nombre de la categoría.
emojien el cuerpostringopcionalUn emoji como símbolo.
iconen el cuerpostringopcionalUn símbolo del conjunto de la app, por su nombre.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageen el cuerpostringopcionalEl id de una imagen que subiste con /media/emoji.
coloren el cuerpostringopcionalEl color del recuadro.brandindigovioletroseambergreentealred

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

PUT/v2/categories/{id}

Renombrar una categoría.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una categoría.
nameen el cuerpostringobligatorioEl nombre de la categoría.
emojien el cuerpostringopcionalUn emoji como símbolo.
iconen el cuerpostringopcionalUn símbolo del conjunto de la app, por su nombre.homehashmegaphonevolumemessagehelpinfobellcalendarbookbookmarkpinshieldstarheartsparklesflamezaptrophygiftrocketlightbulbcodewrenchbriefcasegraduationpalettecamerafilmmusicgamepaddumbbellleafflowerpawsunmooncloudglobemapcoffeepizzasmile
imageen el cuerpostringopcionalEl id de una imagen que subiste con /media/emoji.
coloren el cuerpostringopcionalEl color del recuadro.brandindigovioletroseambergreentealred

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

DELETE/v2/categories/{id}

Borrar una categoría.

  • Derecho groups
  • desde v2.15

Sus canales se quedan, sin categoría.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de una categoría.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

PUT/v2/communities/{id}/feed

Activar o desactivar el canal del feed de un grupo.

  • Derecho groups
  • desde v2.15

Desactivado, las publicaciones siguen guardadas pero solo las ven sus autores.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
onen el cuerpobooleanobligatoriotrue activa el canal del feed, false lo desactiva.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/communities/{id}/invites

Los enlaces de invitación de un grupo que siguen valiendo.

  • Derecho groups
  • con ETag
  • desde v2.15

La dirección ve todos; los demás, solo los suyos.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de InviteLink, como `items` y `next`.

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

Estados posibles: 200304400401403404429

POST/v2/communities/{id}/invites

Crear un enlace de invitación.

  • Derecho groups
  • desde v2.15

Un enlace solo vale mientras puedas invitar, y desaparece cuando sales.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
daysen el cuerpointegeropcionalCuántos días vale el enlace; sin él, hasta que se retire.1730
usesen el cuerpointegeropcionalCuántas veces se puede usar el enlace; sin él, sin límite.151025100

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

DELETE/v2/invites/{code}

Retirar un enlace de invitación.

  • Derecho groups
  • desde v2.15

Parámetros

NombreTipoSignificado
codeen la rutastringobligatorioEl código de un enlace de invitación, el final de su dirección.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Quitar de un canal el mensaje de otro miembro.

  • Derecho groups
  • desde v2.15

Queda en el registro del grupo y como mucho 60 por hora, como en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un mensaje en un canal de chat.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Quitar una publicación de un grupo.

  • Derecho groups
  • desde v2.15

Queda en el registro del grupo y como mucho 60 por hora, como en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
posten la rutastringobligatorioEl id de una publicación.
reasonen el cuerpostringobligatorioEl motivo que lee el miembro.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Expulsar a un miembro de un grupo.

  • Derecho groups
  • desde v2.15

Desde 2.16 es una expulsión: el miembro puede volver. Quien deba quedarse fuera se veta.

Solo con el permiso correspondiente y solo con miembros por debajo de tu rol más alto; a la codirección solo como fundador.

Queda en el registro del grupo y como mucho 60 por hora, como en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.
reasonen el cuerpostringobligatorioEl motivo que lee el miembro.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Silenciar a un miembro.

  • Derecho groups
  • desde v2.16

Un nuevo silencio sustituye al que esté en curso. Salir y volver a unirse no lo termina.

Solo con el permiso correspondiente y solo con miembros por debajo de tu rol más alto; a la codirección solo como fundador.

Queda en el registro del grupo y como mucho 60 por hora, como en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.
secondsen el cuerpointegerobligatorioCuánto tiempo, en segundos.60300600360086400604800
reasonen el cuerpostringopcionalUn motivo que lee el miembro; opcional.

Petición de ejemplo

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"

Respuesta

Responde con un Until.

Ejemplo
{
  "until": 1758624600000
}

Estados posibles: 200400401403404429

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

Quitar un silencio.

  • Derecho groups
  • desde v2.16

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.

Petición de ejemplo

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"

Respuesta

Responde con un Until.

Ejemplo
{
  "until": 1758624600000
}

Estados posibles: 200400401403404429

GET/v2/communities/{id}/bans

Los vetos vigentes de un grupo.

  • Derecho groups
  • con ETag
  • desde v2.16

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de Ban, como `items` y `next`.

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

Estados posibles: 200304400401403404429

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

Vetar a un miembro.

  • Derecho groups
  • desde v2.16

Sin days, el veto dura hasta que se levante.

Solo con el permiso correspondiente y solo con miembros por debajo de tu rol más alto; a la codirección solo como fundador.

Queda en el registro del grupo y como mucho 60 por hora, como en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.
daysen el cuerpointegeropcionalCuánto tiempo, en días; omítelo para un veto sin fin.1730
reasonen el cuerpostringobligatorioEl motivo que lee el miembro.

Petición de ejemplo

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"

Respuesta

Responde con un Until.

Ejemplo
{
  "until": 1758624600000
}

Estados posibles: 200400401403404429

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

Levantar un veto.

  • Derecho groups
  • desde v2.16

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
memberen la rutastringobligatorioEl id de la cuenta de un miembro.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

GET/v2/communities/{id}/log

El registro de la dirección: quién quitó qué y por qué.

  • Derecho groups
  • con ETag
  • desde v2.15

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.

Petición de ejemplo

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

Respuesta

Responde con una página de LogEntry, como `items` y `next`.

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

Estados posibles: 200304400401403404429

POST/v2/communities

Fundar un grupo. Responde con su id; tú eres el fundador.

  • Derecho groups
  • desde v2.19

Necesita el permiso groups. Sin indicarlo, el grupo es internal y de entrada libre; uno oculto solo con invitación. Si los miembros pueden fundar grupos lo decide el operador.

Parámetros

NombreTipoSignificado
nameen el cuerpostringobligatorioEl nombre, como máximo 60 caracteres.
descriptionen el cuerpostringopcionalLa descripción, como máximo 240 caracteres.
handleen el cuerpostringopcionalEl identificador para menciones @# y el enlace: de 3 a 30 minúsculas, cifras o _.
tagsen el cuerpostring[]opcionalHasta 5 #tags sobre el tema del grupo.
joinPolicyen el cuerpostringopcionalCómo se entra: open libre, application con solicitud, invite solo con invitación.openapplicationinvite
visibilityen el cuerpostringopcionalQuién ve el grupo: open todos, internal su contenido solo los miembros, hidden solo los miembros en absoluto.openinternalhidden

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403429

PUT/v2/communities/{id}

Cambiar un grupo que diriges. Lo que no indiques se mantiene.

  • Derecho groups
  • desde v2.19

Necesita el permiso groups y dirigir el grupo. La dirección, la disolución y las ventajas de chispas siguen en la app.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un grupo.
nameen el cuerpostringopcionalEl nombre, como máximo 60 caracteres.
descriptionen el cuerpostringopcionalLa descripción, como máximo 240 caracteres.
handleen el cuerpostringopcionalEl identificador para menciones @# y el enlace: de 3 a 30 minúsculas, cifras o _.
tagsen el cuerpostring[]opcionalHasta 5 #tags sobre el tema del grupo.
joinPolicyen el cuerpostringopcionalCómo se entra: open libre, application con solicitud, invite solo con invitación.openapplicationinvite
visibilityen el cuerpostringopcionalQuién ve el grupo: open todos, internal su contenido solo los miembros, hidden solo los miembros en absoluto.openinternalhidden
imageen el cuerpostringopcionalLa id de una imagen subida (POST /me/pictures) como imagen del grupo. Vacía la quita.
banneren el cuerpostringopcionalLa id de una imagen subida como portada del grupo. Vacía la quita.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Bots

Lo que ocurre en los grupos de un bot, en tiempo real: como flujo, página a página o entregado a una dirección.

GET/v2/events

Los eventos de los grupos del bot desde un evento, página a página.

  • Derecho read
  • desde v2.20

Solo con el token de un bot. Los eventos de un canal solo si el bot puede verlo.

Los eventos se guardan un día. next es el número del último, como since para la página siguiente.

Parámetros

NombreTipoSignificado
sinceen la direcciónstringopcionalEl número del último evento que el bot ya tiene. Sin él, el flujo empieza ahora y la lista por el más antiguo.

Petición de ejemplo

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

Respuesta

Responde con una página de BotEvent, como `items` y `next`.

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

Estados posibles: 200401429

GET/v2/events/stream

Los eventos de los grupos del bot en cuanto ocurren (server-sent events).

  • Derecho read
  • con ETag
  • desde v2.20

La conexión queda abierta y se cierra tras diez minutos; el cliente se reconecta y envía Last-Event-ID.

Solo con el token de un bot. Los eventos de un canal solo si el bot puede verlo.

Parámetros

NombreTipoSignificado
sinceen la direcciónstringopcionalEl número del último evento que el bot ya tiene. Sin él, el flujo empieza ahora y la lista por el más antiguo.

Petición de ejemplo

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

Respuesta

Responde con un BotEvent.

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

Estados posibles: 200304401429

GET/v2/me/commands

Los comandos del bot.

  • Derecho read
  • con ETag
  • desde v2.20

Solo con el token de un bot. Los eventos de un canal solo si el bot puede verlo.

Petición de ejemplo

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

Respuesta

Responde con una página de BotCommand, como `items` y `next`.

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

Estados posibles: 200304401429

PUT/v2/me/commands

Definir los comandos del bot, todos a la vez.

  • Derecho write
  • desde v2.20

Sustituye todos los comandos; una lista vacía los quita. En los chats que el bot puede ver, el campo de texto los ofrece tras «/».

Parámetros

NombreTipoSignificado
commandsen el cuerpoobject[]obligatorioHasta 25 comandos, cada uno { name, description }.

Petición de ejemplo

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"

Respuesta

Responde con una página de BotCommand, como `items` y `next`.

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

Estados posibles: 200400401403429

POST/v2/interactions/{id}/reply

Responder a un comando o a un botón.

  • Derecho write
  • desde v2.20

En los 15 minutos siguientes al evento command o interaction; con private, solo quien usó el comando o el botón ve la respuesta.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id del evento (data.interaction).
texten el cuerpostringopcionalEl texto de la publicación, la respuesta o el mensaje.
privateen el cuerpobooleanopcionaltrue: solo quien usó el comando o el botón ve la respuesta, durante un día.
carden el cuerpoobjectopcionalUna tarjeta { title, text, color, fields: [{ name, value }] }, como máximo 10 campos.
buttonsen el cuerpoobject[]opcionalHasta 5 botones, cada uno { id, label, style } con style primary, secondary o danger. Una pulsación llega como evento interaction.

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

POST/v2/channels/{id}/voice

Ocupar un sitio en un canal de voz para reproducir música o sonido.

  • Derecho write
  • desde v2.20

Solo con el token de un bot, según lo que permita su rol en el canal. El programa se conecta con un SDK de LiveKit y envía su sonido como micrófono; cada cual ajusta su volumen.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl id de un canal.

Petición de ejemplo

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

Respuesta

Responde con un VoiceSeat.

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

Estados posibles: 200400401403404429

Descubrir

Tendencias, búsqueda y los emojis propios de la instancia.

GET/v2/tags

Las etiquetas que están en marcha ahora mismo.

  • Derecho read
  • con ETag
  • desde v2.0

Como máximo 10 etiquetas en tendencia por puntos: cada uso cuenta 1 y se reduce a la mitad cada 3 días; una cuenta suma como máximo 3 al día. posts es la puntuación redondeada. limit solo acorta la lista. Las etiquetas que destaca el equipo pueden aparecer más arriba.

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.

Petición de ejemplo

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

Respuesta

Responde con una página de Tag, como `items` y `next`.

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

Estados posibles: 200304401429

GET/v2/search

Una búsqueda por publicaciones, nombres, alias y etiquetas.

  • Derecho read
  • con ETag
  • desde v2.0

Busca solo lo público: publicaciones fuera de grupos, perfiles y etiquetas. limit se aplica por tipo.

Parámetros

NombreTipoSignificado
qen la direcciónstringobligatorioLas palabras que se buscan.
typeen la direcciónstringopcionalQué clase de resultado. Sin él, todas las clases.allpostsprofilestags
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.

Petición de ejemplo

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

Respuesta

Responde con un SearchResult.

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

Estados posibles: 200304400401429

GET/v2/emojis

Los emojis propios de la instancia, con la dirección de sus imágenes.

  • Derecho read
  • con ETag
  • desde v2.1

En los textos un emoji aparece como :name:. Sustitúyelo por la imagen de esta lista; los nombres desconocidos quedan como texto.

Petición de ejemplo

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

Respuesta

Responde con una página de Emoji, como `items` y `next`.

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

Estados posibles: 200304401429

GIF y vídeos

La biblioteca multimedia: encontrar GIF y vídeos compartidos, subir y gestionar los tuyos e insertarlos en otros sitios web.

GET/v2/media

GIF o vídeos compartidos, los más usados primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.14

Sin las cuentas que has bloqueado o que te han bloqueado. Carga url y poster con la clave en el encabezado, para las publicaciones en tellmelo.

Para otros sitios web, solo lo que tiene embed: sus direcciones funcionan sin clave, en cualquier navegador.

Parámetros

NombreTipoSignificado
kinden la direcciónstringopcionalgif o video; si no se indica, gif.gifvideo
qen la direcciónstringopcionalPalabras que aparecen en el nombre o en las palabras clave.
anywhereen la direcciónbooleanopcionaltrue: solo lo que también puede aparecer en otros sitios web.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de MediaItem, como `items` y `next`.

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

Estados posibles: 200304400401429

GET/v2/media/mine

Tu propia biblioteca multimedia, lo más nuevo primero.

  • Derecho media
  • paginable
  • con ETag
  • desde v2.14

Parámetros

NombreTipoSignificado
kinden la direcciónstringopcionalgif o video; si no se indica, gif.gifvideo
qen la direcciónstringopcionalPalabras que aparecen en el nombre o en las palabras clave.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de MediaItem, como `items` y `next`.

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

Estados posibles: 200304400401403429

GET/v2/media/{id}

Un GIF o vídeo, tuyo o compartido.

  • Derecho read
  • con ETag
  • desde v2.14

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl ID del GIF o vídeo.

Petición de ejemplo

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

Respuesta

Responde con un MediaItem.

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

Estados posibles: 200304400401404429

POST/v2/media/uploads

Iniciar una subida.

  • Derecho media
  • desde v2.14

Después envía el archivo en fragmentos de como máximo piece bytes a /media/uploads/{upload}. Sin un fragmento nuevo, una subida termina a los 15 minutos.

Se aplican los límites de la app: GIF de hasta 15 MB, vídeos según la suscripción en tamaño y duración, GIF por día, GIF privados, puntos de vídeo por semana. Si no, recibes 409, 413 o 429.

Parámetros

NombreTipoSignificado
kinden el cuerpostringobligatoriogif o video; si no se indica, gif.gifvideo
sizeen el cuerpointegerobligatorioEl tamaño del archivo completo en bytes.
nameen el cuerpostringobligatorioEl nombre con el que se encuentra: de 2 a 40 caracteres.
keywordsen el cuerpostringopcionalPalabras clave para la búsqueda, separadas por espacios.
shareden el cuerpobooleanopcionaltrue: compartido con todos en tellmelo.
anywhereen el cuerpobooleanopcionaltrue: compartido y permitido también en otros sitios web. Solo junto con shared.

Petición de ejemplo

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"

Respuesta

Responde con un UploadStarted.

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

Estados posibles: 200400401403429

PUT/v2/media/uploads/{upload}

Enviar un fragmento del archivo.

  • Derecho media
  • desde v2.14

El cuerpo es el propio fragmento (application/octet-stream), no JSON. Si no continúa lo anterior, recibes 409 con received: sigue desde ahí. Tras el último fragmento se convierte el archivo; la respuesta incluye entonces item.

Parámetros

NombreTipoSignificado
uploaden la rutastringobligatorioEl upload del inicio.
offseten la direcciónintegerobligatorioDónde empieza el fragmento en el archivo, en bytes; 0 para el primero.

Petición de ejemplo

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"

Respuesta

Responde con un UploadPiece.

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

Estados posibles: 200400401403404429

POST/v2/media/{id}

Cambiar uno de tus GIF o vídeos.

  • Derecho media
  • desde v2.14

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl ID del GIF o vídeo.
nameen el cuerpostringopcionalEl nombre con el que se encuentra: de 2 a 40 caracteres.
keywordsen el cuerpostringopcionalPalabras clave para la búsqueda, separadas por espacios.
shareden el cuerpobooleanopcionaltrue: compartido con todos en tellmelo.
anywhereen el cuerpobooleanopcionaltrue: compartido y permitido también en otros sitios web. Solo junto con shared.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

DELETE/v2/media/{id}

Eliminar uno de tus GIF o vídeos.

  • Derecho media
  • desde v2.14

Las publicaciones que ya lo muestran lo conservan. En otros sitios web desaparece en pocos minutos.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioEl ID del GIF o vídeo.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Tu cuenta

Tu perfil, tu feed, tus propios emojis y tus webhooks.

GET/v2/me

Tu propio perfil, con el id que esperan las demás rutas.

  • Derecho read
  • con ETag
  • desde v2.0

Petición de ejemplo

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

Respuesta

Responde con un Profile.

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

Estados posibles: 200304401429

GET/v2/feed

Tu propio feed, tal como lo compone la aplicación.

  • Derecho read
  • paginable
  • desde v2.0

Sin ETag, porque el orden cambia constantemente. Una lista empezada se mantiene igual hasta el final.

Parámetros

NombreTipoSignificado
taben la direcciónstringopcionalQué feed: for-you, following, latest o bookmarks. latest por defecto.for-youfollowinglatestbookmarks
tagen la direcciónstringopcionalSolo publicaciones sobre esta etiqueta: escritas con ella o en las que el servidor la reconoce. Sin ella, ningún filtro.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Post, como `items` y `next`.

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

Estados posibles: 200400401429

POST/v2/me/pictures

Subir una imagen, como sus bytes. Responde con id y url; luego usas la id como foto de perfil, portada o en una publicación.

  • Derecho write
  • desde v2.19

PNG, JPEG, WebP o GIF, reconocido por sus primeros bytes; se guarda de nuevo sin metadatos. Una imagen que no se usa en nada se borra más tarde.

Petición de ejemplo

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"

Respuesta

Responde con un Picture.

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

Estados posibles: 200401403429

PUT/v2/me/profile

Cambiar tu perfil: nombre, sobre ti, foto de perfil, portada y color del perfil. Lo que no indiques se mantiene.

  • Derecho profile
  • desde v2.19

Necesita el permiso profile. Tu @nombre se queda en la app: también es tu nombre de inicio de sesión.

Parámetros

NombreTipoSignificado
nameen el cuerpostringopcionalEl nombre visible, como máximo 60 caracteres.
abouten el cuerpostringopcionalEl texto «Sobre ti».
avataren el cuerpostringopcionalLa id de una imagen subida como foto de perfil. Vacía la quita.
banneren el cuerpostringopcionalLa id de una imagen subida como portada. Vacía la quita.
coloren el cuerpostringopcionalEl color del perfil, con una suscripción. null lo quita.indigovioletrosecoralamberlimegreentealskyslatesandnight

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403429

GET/v2/me/emojis

Tus propios emojis.

  • Derecho read
  • con ETag
  • desde v2.19

Petición de ejemplo

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

Respuesta

Responde con una página de OwnEmoji, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/me/emojis/pictures

Subir la imagen de un emoji propio, como sus bytes.

  • Derecho profile
  • desde v2.19

Los emojis animados necesitan una suscripción. Si tras convertirla es demasiado grande, la imagen se rechaza.

Petición de ejemplo

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"

Respuesta

Responde con un EmojiPicture.

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

Estados posibles: 200401403429

POST/v2/me/emojis

Crear un emoji propio. Responde con todos tus emojis.

  • Derecho profile
  • desde v2.19

Cuántos emojis puedes crear depende de tu suscripción.

Parámetros

NombreTipoSignificado
nameen el cuerpostringobligatorioEl nombre con el que escribes el emoji, como :nombre:.
pictureen el cuerpostringobligatorioLa id de POST /me/emojis/pictures.

Petición de ejemplo

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"

Respuesta

Responde con una página de OwnEmoji, como `items` y `next`.

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

Estados posibles: 200400401403429

DELETE/v2/me/emojis/{name}

Quitar un emoji propio. Responde con los demás.

  • Derecho profile
  • desde v2.19

Parámetros

NombreTipoSignificado
nameen la rutastringobligatorioEl nombre del emoji, sin dos puntos.

Petición de ejemplo

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

Respuesta

Responde con una página de OwnEmoji, como `items` y `next`.

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

Estados posibles: 200400401403404429

PUT/v2/me/emojis/sharing

Decidir si tus seguidores pueden usar tus emojis en sus propios textos.

  • Derecho profile
  • desde v2.19

Parámetros

NombreTipoSignificado
shareden el cuerpobooleanobligatoriotrue comparte tus emojis con tus seguidores, false no.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403429

GET/v2/me/webhooks

Tus webhooks con su estado.

  • Derecho webhooks
  • con ETag
  • desde v2.19

Necesita el permiso webhooks. Los webhooks vienen con una suscripción de organización o como socio.

Petición de ejemplo

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

Respuesta

Responde con una página de Webhook, como `items` y `next`.

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

Estados posibles: 200304401403429

POST/v2/me/webhooks

Crear un webhook. Responde con la id y el secreto para las firmas, solo esta vez.

  • Derecho webhooks
  • desde v2.19

Cada entrega va firmada con el secreto (X-Tellmelo-Signature). Guárdalo; no se vuelve a mostrar.

Parámetros

NombreTipoSignificado
urlen el cuerpostringobligatorioUna dirección HTTPS fuera de redes locales, sin credenciales.
kindsen el cuerpostring[]obligatorioDe qué se avisa al webhook. Qué tipos tienes disponibles depende de tu suscripción y de si eres socio.replymentiongroup_mentionfollowlikerepostmessagequota_changedquota_giftdrop_claimeddrop_empty

Petición de ejemplo

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"

Respuesta

Responde con un WebhookCreated.

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

Estados posibles: 200400401403429

DELETE/v2/me/webhooks/{id}

Borrar un webhook.

  • Derecho webhooks
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del webhook.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Enviar una prueba a un webhook.

  • Derecho webhooks
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del webhook.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Notificaciones

Lo que ha pasado en tu cuenta, por páginas.

GET/v2/notifications

Tus notificaciones, las más nuevas primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

Leer no marca nada como leído; eso lo hace POST /notifications/read. Los eventos del mismo tipo en la misma publicación comparten una fila; more dice cuántos.

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Notification, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/notifications/read

Marcar tus notificaciones como leídas.

  • Derecho write
  • desde v2.0

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200401403429

Mensajes

Tu bandeja y tus conversaciones. Una conversación se identifica por la otra cuenta.

GET/v2/conversations

Tu buzón: una fila por conversación, la más reciente primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Conversation, como `items` y `next`.

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

Estados posibles: 200304401429

GET/v2/conversations/{with}/messages

Los mensajes de una conversación, los más nuevos primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.0

Leer no marca nada como leído; eso lo hace POST /conversations/{with}/read.

Parámetros

NombreTipoSignificado
withen la rutastringobligatorioEl id de la otra cuenta. Una conversación no tiene id propio.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Message, como `items` y `next`.

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

Estados posibles: 200304400401404429

POST/v2/conversations/{with}/messages

Enviar un mensaje en una conversación.

  • Derecho write
  • desde v2.0

Rigen las reglas de la app: quien te ha bloqueado no es accesible y cuentan los ajustes de la otra persona.

Las imágenes, los GIF y los vídeos no se pueden adjuntar a mensajes a través de la API, solo en la app.

Parámetros

NombreTipoSignificado
withen la rutastringobligatorioEl id de la otra cuenta. Una conversación no tiene id propio.
texten el cuerpostringobligatorioEl texto de la publicación, la respuesta o el mensaje.
replyToen el cuerpostringopcionalEl id de un mensaje anterior de esta conversación al que responde este. Desde 2.2.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/conversations/{with}/read

Marcar como leídos todos los mensajes de una conversación.

  • Derecho write
  • desde v2.1

Parámetros

NombreTipoSignificado
withen la rutastringobligatorioEl id de la otra cuenta. Una conversación no tiene id propio.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Borrar uno de tus mensajes.

  • Derecho write
  • desde v2.12

Solo tus propios mensajes, y solo en las 24 horas siguientes al envío.

Parámetros

NombreTipoSignificado
withen la rutastringobligatorioEl id de la otra cuenta. Una conversación no tiene id propio.
iden la rutastringobligatorioEl identificador del mensaje.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

POST/v2/conversations/{with}/planned

Programar un mensaje para más tarde. Responde con la id del mensaje programado.

  • Derecho write
  • desde v2.19

Necesita una suscripción con mensajes programados, si no 403. Con cifrado de extremo a extremo en ambos lados solo funciona en la app.

Parámetros

NombreTipoSignificado
withen la rutastringobligatorioEl id de la otra cuenta. Una conversación no tiene id propio.
texten el cuerpostringobligatorioEl texto de la publicación, la respuesta o el mensaje.
sendAten el cuerpointegerobligatorioCuándo se envía el mensaje, en milisegundos desde 1970.

Petición de ejemplo

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"

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403404429

GET/v2/me/planned-messages

Tus mensajes que aún se van a enviar, por orden de hora.

  • Derecho read
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
withen la direcciónstringopcionalSolo los mensajes para esta cuenta (su id).

Petición de ejemplo

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

Respuesta

Responde con una página de PlannedMessage, como `items` y `next`.

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

Estados posibles: 200304401429

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

Enviar ahora un mensaje programado retenido o fallido.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del mensaje programado.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Borrar un mensaje programado antes de que se envíe.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id del mensaje programado.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Relaciones

Me gusta, guardar, compartir, seguir, unirse, bloquear: una ruta, activada y retirada con active. Desde 2.19 también las listas: seguidores, seguidos y tus propios bloqueos y silencios.

POST/v2/relations

Dar me gusta, guardar, compartir, seguir, unirse, bloquear, silenciar, según kind.

  • Derecho write
  • desde v2.0

target es una publicación con like, save y repost, un grupo con join y una cuenta con follow, block y mute. active: false retira la relación.

Parámetros

NombreTipoSignificado
kinden el cuerpostringobligatorioQué relación: like, save, repost, follow, join, block o mute (desde 2.2).likesaverepostfollowjoinblockmute
targeten el cuerpostringobligatorioEl id de la publicación, el perfil o el grupo, según kind.
activeen el cuerpobooleanopcionaltrue la establece, false la retira.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403429

GET/v2/profiles/{handle}/followers

Quién sigue a un perfil, los más recientes primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
handleen la rutastringobligatorioEl alias de un perfil, con mayúsculas o minúsculas, da igual.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de ProfileBrief, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/profiles/{handle}/following

A quién sigue un perfil, los más recientes primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.19

Parámetros

NombreTipoSignificado
handleen la rutastringobligatorioEl alias de un perfil, con mayúsculas o minúsculas, da igual.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de ProfileBrief, como `items` y `next`.

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

Estados posibles: 200304400401404429

GET/v2/me/relations

A quién has bloqueado, silenciado o bloqueado solo para mensajes, los más recientes primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.19

Solo tus propias listas. Activar y retirar se hace con POST /relations.

Parámetros

NombreTipoSignificado
kinden la direcciónstringobligatorioblock bloqueados, mute silenciados, dm_block bloqueados solo para mensajes.blockmutedm_block
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de ProfileBrief, como `items` y `next`.

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

Estados posibles: 200304400401429

Colecciones

Ordena las publicaciones guardadas en tus propias colecciones. Una publicación puede estar en varias; si la sacas de una colección, sigue guardada.

GET/v2/me/collections

Tus colecciones con el número de publicaciones.

  • Derecho read
  • con ETag
  • desde v2.19

Petición de ejemplo

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

Respuesta

Responde con una página de Collection, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/me/collections

Crear una colección. Responde con su id.

  • Derecho write
  • desde v2.19

Cuántas colecciones puedes crear depende de tu suscripción.

Parámetros

NombreTipoSignificado
nameen el cuerpostringobligatorioEl nombre, como máximo 40 caracteres. Único por cuenta, sin distinguir mayúsculas.

Petición de ejemplo

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

Respuesta

Responde con un Made.

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

Estados posibles: 200400401403429

PUT/v2/me/collections/{id}

Cambiar el nombre de una colección.

  • Derecho write
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la colección.
nameen el cuerpostringobligatorioEl nombre, como máximo 40 caracteres. Único por cuenta, sin distinguir mayúsculas.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

DELETE/v2/me/collections/{id}

Borrar una colección.

  • Derecho write
  • desde v2.19

Las publicaciones que contiene siguen guardadas.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la colección.

Petición de ejemplo

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

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

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

Las publicaciones de una colección, como en la pestaña de guardados.

  • Derecho read
  • paginable
  • desde v2.19

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la colección.
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de Post, como `items` y `next`.

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

Estados posibles: 200400401404429

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

Meter una publicación en una colección o sacarla.

  • Derecho write
  • desde v2.19

Meter una publicación también la guarda. Solo publicaciones visibles.

Parámetros

NombreTipoSignificado
iden la rutastringobligatorioLa id de la colección.
posten el cuerpostringobligatorioLa id de la publicación.
insideen el cuerpobooleanopcionaltrue mete la publicación (por defecto), false la saca.

Petición de ejemplo

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"

Respuesta

Responde con un Ok.

Ejemplo
{
  "ok": true
}

Estados posibles: 200400401403404429

Regalos

Consultar el contingente de un socio y regalar desde él, poner regalos bajo publicaciones y seguirlos de cerca. Recogerlos queda reservado a las personas, en la app.

GET/v2/partner/quota

Lo que te queda por regalar en tu contingente.

  • Derecho read
  • con ETag
  • desde v2.12

Solo para socios con contingente; los demás reciben 403.

Petición de ejemplo

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

Respuesta

Responde con un Quota.

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

Estados posibles: 200304401429

GET/v2/partner/gifts

Lo que has regalado de tu contingente, a quién y cuándo, lo más reciente primero.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.12

Solo para socios con contingente; los demás reciben 403.

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de QuotaGift, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/partner/gifts

Regalar meses de suscripción o chispas de tu contingente a un miembro.

  • Derecho gifts
  • desde v2.12

Solo para socios con contingente; los demás reciben 403.

Igual que en la app, el miembro ve de quién es el regalo. Como máximo 60 regalos por hora.

Parámetros

NombreTipoSignificado
handleen el cuerpostringobligatorioEl @nombre del miembro al que regalas, con o sin @.
itemen el cuerpostringobligatorioplan para meses de suscripción, sparks para chispas, shop para un estilo de tu reserva (desde 2.13).plansparksshop
quantityen el cuerpointegeropcionalCuánto: hasta 12 meses o 35 chispas por regalo.
itemIden el cuerpostringopcionalPara shop: el ID del estilo, tal como lo indica looks en el contingente. Un ejemplar por regalo; quantity no se aplica entonces.

Petición de ejemplo

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"

Respuesta

Responde con un Quota.

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

Estados posibles: 200400401403429

GET/v2/gift-drops

Tus regalos bajo publicaciones: cuántas plazas siguen libres y cómo se pagaron.

  • Derecho read
  • paginable
  • con ETag
  • desde v2.12

Parámetros

NombreTipoSignificado
limiten la direcciónintegeropcionalEntradas por página: 20 por defecto, como máximo 50.
cursoren la direcciónstringopcionalEl next de la respuesta anterior. Sin él, desde el principio.

Petición de ejemplo

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

Respuesta

Responde con una página de OwnGiftDrop, como `items` y `next`.

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

Estados posibles: 200304401429

POST/v2/gift-drops

Publicar una publicación con regalos para que otros los recojan.

  • Derecho gifts
  • desde v2.12

Gratis para el propietario y los miembros del equipo con ese permiso; si no, sale de tu contingente. Lo que habría que pagar se rechaza con 422: pagar solo se puede en la app.

Recoger solo se puede en la app, para que ningún programa se lleve todas las plazas. Cuántas quedan libres aparece en giftDrop de la publicación.

Parámetros

NombreTipoSignificado
texten el cuerpostringopcionalEl texto de la publicación, la respuesta o el mensaje.
communityen el cuerpostringopcionalEl id del grupo a cuyo canal del feed va la publicación; debe estar activado y necesitas el permiso. Sin él, la publicación queda fuera de cualquier grupo.
itemen el cuerpostringobligatorioplan para meses de suscripción, sparks para chispas.plansparks
quantityen el cuerpointegerobligatorioLo que lleva cada plaza: hasta 12 meses o 35 chispas.
placesen el cuerpointegerobligatorioPara cuántas personas, hasta 10 000.
audienceen el cuerpostringopcionalQuién puede recoger: all todos, followers solo tus seguidores, group solo los miembros del grupo (solo junto con community).allfollowersgroup
newAccountsen el cuerpobooleanopcionaltrue deja recoger también a cuentas con menos de 7 días. Si no lo indicas, se quedan fuera.

Petición de ejemplo

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"

Respuesta

Responde con un DropCreated.

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

Estados posibles: 200400401403429

Objetos

Todos los objetos, campo por campo. [] significa lista.

Service

La respuesta de la raíz: quién responde y qué puede hacer esta clave.

CampoTipoSignificado
namestringSiempre tellmelo.
versionstringLa versión de la API, por ejemplo 2.1.
scopestringLo que puede hacer esta clave: read o read write.
rateLimitRateLimitEl cupo de esta clave.
docsstringDónde está esta documentación, como ruta en esta instancia.
specstringDónde está la descripción legible por máquina.
Ejemplo
{
  "name": "tellmelo",
  "version": "2.20",
  "scope": "read write",
  "rateLimit": {
    "limit": 120,
    "remaining": 117
  },
  "docs": "/developers/docs",
  "spec": "/api/v2/openapi.json"
}

RateLimit

El cupo de esta clave en el minuto actual.

CampoTipoSignificado
limitintegerPeticiones por minuto.
remainingintegerCuántas quedan en este minuto.
Ejemplo
{
  "limit": 120,
  "remaining": 117
}

Post

Una publicación, con la misma forma en todas partes.

CampoTipoSignificado
idstringEl identificador de la publicación.
textstringo nullEl texto tal como se escribió (null para una publicación que solo es una encuesta o solo imágenes).
kindstringQué es la publicación.
  • post — Una publicación con texto, imágenes o una cita.
  • poll — Una publicación con una encuesta.
authorProfileBriefQuién la escribió.
communityCommunityBriefo nullEl grupo en el que se escribió (null fuera de cualquier grupo).
mediaMedia[]Sus imágenes, en orden; vacía si no hay ninguna.
pollPollo nullLa encuesta (null si no hay ninguna).
quotesstringo nullEl identificador de la publicación que esta cita.
continuesstringo nullEl identificador de la publicación que esta continúa, como añadido.
countsCountsRespuestas, me gusta y publicaciones compartidas.
pinnedbooleanSi está fijada arriba en el perfil de quien la escribió.
giftDropGiftDropo nullLos regalos para recoger bajo la publicación (null si no hay).
createdAtintegerCuándo se escribió.
Ejemplo
{
  "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

Una respuesta bajo una publicación: una publicación con dos campos más.

Todos los campos de Post y, además:

CampoTipoSignificado
postIdstringLa publicación de la que cuelga toda la conversación.
parentIdstringo nullLa respuesta a la que responde esta (null si responde directamente a la publicación).
Ejemplo
{
  "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

Tu voto en una respuesta y su puntuación.

CampoTipoSignificado
votestringTu voto.
  • up — A favor.
  • down — En contra.
  • none — Sin voto.
scoreintegerVotos a favor menos votos en contra, también por debajo de cero.
Ejemplo
{
  "vote": "up",
  "score": 12
}

PlannedReply

Una respuesta tuya programada para más tarde.

CampoTipoSignificado
idstringLa id de la respuesta programada.
parentIdstringo nullLa respuesta a la que contestará (null si contesta directamente a la publicación).
textstringEl texto.
publishAtintegerCuándo sale.
statestringSu estado.
  • waiting — Espera su hora.
  • failed — No se pudo enviar, por ejemplo porque la publicación ya no existe.
Ejemplo
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "parentId": null,
  "text": "Count me in for Saturday!",
  "publishAt": 1758710400000,
  "state": "waiting"
}

ReplySettings

Los ajustes de respuesta de una de tus publicaciones.

CampoTipoSignificado
audiencestringQuién puede responder.
  • all — Todos.
  • following — Cuentas que sigues.
  • mentioned — Las mencionadas en la publicación.
  • nobody — Nadie salvo tú.
approvalbooleanSi las respuestas esperan tu aprobación.
slowstringEl modo lento.
  • auto — Se activa solo cuando llegan muchas respuestas.
  • on — Siempre activado.
  • off — Desactivado.
Ejemplo
{
  "audience": "following",
  "approval": false,
  "slow": "auto"
}

Counts

Cuántas respuestas, me gusta y publicaciones compartidas tiene una publicación.

CampoTipoSignificado
repliesintegerRespuestas, todos los niveles juntos.
likesintegerMe gusta.
repostsintegerPublicaciones compartidas.
Ejemplo
{
  "replies": 4,
  "likes": 31,
  "reposts": 2
}

Media

Una imagen de una publicación o de un mensaje.

CampoTipoSignificado
urlstringLa dirección de la imagen o del vídeo, relativa a esta instancia. Cárgala con la clave en la cabecera.
kindstringimage, video o gif (desde 2.10). Los vídeos y GIF son archivos MP4.
  • image — Una imagen (WebP o JPEG).
  • video — Un vídeo en MP4, con sonido.
  • gif — Un GIF, como MP4 sin sonido en bucle.
posterstringo nullEn vídeos y GIF, la dirección de la imagen de vista previa; si no, null (desde 2.10).
aistringo nullSi la imagen se hizo con IA, según lo indicó quien la subió o lo marcó el equipo tras una denuncia; null sin indicación (desde 2.11).
  • with — Hecho con IA.
  • without — Hecho sin IA.
Ejemplo
{
  "url": "/api/media?id=b2d7e9f1-3c4a-4e8b-a1f0-6d5c4b3a2918",
  "kind": "image",
  "poster": null,
  "ai": "without"
}

Poll

La encuesta de una publicación.

CampoTipoSignificado
optionsPollOption[]Las respuestas, en orden. option al votar cuenta desde 0.
totalintegerTodos los votos juntos, siempre presente.
multiplebooleanSi se puede elegir más de una respuesta.
endsAtintegero nullCuándo termina la encuesta (null si no tiene fin).
runningbooleanSi todavía se puede votar.
resultsVisiblebooleanSi se muestran los votos por respuesta (ver votes).
myVotesinteger[]Las respuestas que elegiste, contadas desde 0.
Ejemplo
{
  "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

Una respuesta de una encuesta.

CampoTipoSignificado
textstringLa respuesta.
votesintegero nullSus votos (null mientras el resultado esté retenido).
Ejemplo
{
  "text": "Lavender",
  "votes": 12
}

ProfileBrief

Un perfil tal como aparece dentro de otros objetos: como autor, en una búsqueda.

CampoTipoSignificado
idstringEl identificador de la cuenta: lo que esperan /relations y /conversations/{with}.
handlestringEl nombre corto, sin @, escrito como lo eligió el miembro.
namestringEl nombre visible. Puede contener emojis, también :name:.
verifiedbooleanSi la cuenta está verificada.
accountKindstringQué tipo de cuenta es.
  • person — Una persona.
  • business — Una empresa.
  • association — Una asociación.
  • automated — Una cuenta automatizada, como un bot.
  • bot — Un bot de grupos, controlado por un programa con su propia clave (desde 2.18).
Ejemplo
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "verified": true,
  "accountKind": "person"
}

Profile

Un perfil por sí solo, con su descripción y sus seguidores.

Todos los campos de ProfileBrief y, además:

CampoTipoSignificado
aboutstringo nullLa descripción (null si no hay ninguna).
websitestringo nullLa web del perfil (null si no hay). Desde 2.3.
websiteVerifiedbooleanSi la web enlaza a este perfil con rel=me, comprobado cada semana. Desde 2.3.
followersintegerCuántas cuentas la siguen.
createdAtintegero nullCuándo se creó la cuenta (null mientras el miembro oculta la fecha de registro; desde 2.9).
Ejemplo
{
  "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

El grupo en el que se escribió una publicación.

CampoTipoSignificado
idstringEl identificador del grupo.
namestringo nullSu nombre.
Ejemplo
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening"
}

Community

Un grupo de esta instancia.

CampoTipoSignificado
idstringEl identificador del grupo.
namestringSu nombre.
handlestringo nullEl nombre corto para mencionar el grupo con @#. Desde 2.15.
descriptionstringo nullLa descripción (null si no hay ninguna).
tagsstring[]Los temas de los que trata.
membersintegerCuántos miembros tiene.
joinPolicystringCómo se entra.
  • open — Cualquiera puede unirse.
  • application — Unirse requiere una solicitud que el grupo acepta.
  • invite — Solo por invitación.
visibilitystringQuién lo ve. internal y hidden solo sus miembros (desde 2.15).
  • open — Visible para todo el mundo.
  • internal — No aparece en el directorio, pero sí por su dirección.
  • hidden — Solo para sus miembros.
feedChannelbooleanSi su canal del feed está activado. Desde 2.15.
sparksintegerCuántas chispas tiene el grupo ahora (desde 2.19).
perksstring[]Las ventajas que pagan sus chispas (desde 2.19).
membershipMembershipo nullLo que tu cuenta es y puede en el grupo; null si no es miembro. Desde 2.15.
Ejemplo
{
  "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

Lo que tu cuenta es y puede en el grupo.

CampoTipoSignificado
leaderstringo nullSi fundaste el grupo o lo codiriges; null si no.
  • founder — Fundado.
  • manager — Codirección.
rolesstring[]Los id de tus roles, el más alto primero.
permissionsstring[]Lo que puedes hacer en el grupo.
mutedUntilintegero nullHasta cuándo te silencia aquí un silencio temporal; null si no hay.
Ejemplo
{
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "permissions": [
    "attach",
    "invite",
    "send",
    "view"
  ],
  "mutedUntil": null
}

Person

Un miembro, en breve.

CampoTipoSignificado
idstringEl id de la cuenta.
handlestringEl nombre de usuario, sin @.
namestringEl nombre visible.
botbooleanSi la cuenta es un bot (desde 2.18).
Ejemplo
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false
}

Channel

Un canal de un grupo.

CampoTipoSignificado
idstringEl id.
kindstringQué tipo de canal.
  • feed — El canal del feed, cuyas publicaciones también están en el feed público.
  • chat — Un chat.
  • voice — Un canal de voz; solo se habla en la app.
  • hub — El hub del grupo: su página con lo que es. Siempre está, sin mensajes.
namestringo nullEl nombre sin #; null para el nombre que la app da en cada idioma.
topicstringEl tema; vacío si no hay.
categoryChannelCategoryo nullLa categoría; null sin ella.
unreadintegerCuántos mensajes de otros aún no has leído, hasta 100.
permissionsstring[]Lo que puedes hacer en este canal.
symbolChannelSymbolSu símbolo; la forma ya es la del grupo si este la fija.
Ejemplo
{
  "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 categoría en la que está un canal.

CampoTipoSignificado
idstringEl id.
namestringEl nombre.
symbolChannelSymbolSu símbolo.
Ejemplo
{
  "id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "name": "Garden",
  "symbol": {
    "emoji": null,
    "icon": null,
    "image": null,
    "color": null,
    "shape": null
  }
}

ChannelSymbol

El símbolo de un canal o categoría: como mucho uno de emoji, símbolo e imagen; si no, el signo de su tipo.

CampoTipoSignificado
emojistringo nullEl emoji; null si no hay.
iconstringo nullEl nombre del símbolo del conjunto de la app; null si no hay.
imagestringo nullLa dirección de la imagen propia; null si no hay.
colorstringo nullEl color del recuadro; null para el de su tipo.
shapestringo nullLa forma del recuadro; null para un círculo.
Ejemplo
{
  "emoji": "🌻",
  "icon": null,
  "image": null,
  "color": "amber",
  "shape": "circle"
}

ChannelMessage

Un mensaje en un canal de chat.

CampoTipoSignificado
idstringEl id.
textstringo nullEl texto (null en un mensaje solo de imágenes o voz).
authorPersonQuién lo escribió.
mediaMedia[]Sus imágenes y mensajes de voz; vacío si no hay.
replyTostringo nullEl id del mensaje al que responde; null si a ninguno.
roleColorstringo nullEl color del rol más alto del autor que tenga uno; null si no hay.
threadOfstringo nullEl mensaje en cuyo hilo responde este; null en el chat.
threadCountintegerCuántas respuestas tiene el hilo de este mensaje.
cardobjecto nullLa tarjeta de un bot: title, text, color y fields; si no, null.
buttonsobject[]Los botones de un bot: cada uno id, label y style.
createdAtintegerCuándo se escribió.
Ejemplo
{
  "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 rol de un grupo.

CampoTipoSignificado
idstringEl id.
namestringo nullEl nombre; null para @everyone.
everyonebooleanSi es @everyone, el rol de todos los miembros.
colorstringo nullEl color: indigo, violet, rose, amber, green o teal; null sin color.
permissionsstring[]Sus permisos.
membersintegerCuántos lo tienen; en @everyone todos los miembros.
editablebooleanSi tu cuenta puede cambiarlo.
selfablebooleanSi los miembros toman y dejan el rol por sí mismos.
Ejemplo
{
  "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 miembro de un grupo con sus roles.

Todos los campos de Person y, además:

CampoTipoSignificado
leaderstringo nullSi el miembro fundó el grupo o lo codirige; null si no.
  • founder — Fundado.
  • manager — Codirección.
rolesstring[]Los id de sus roles, el más alto primero.
mutedUntilintegero nullHasta cuándo está silenciado el miembro, si tu cuenta puede silenciar; si no, null.
Ejemplo
{
  "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
  "handle": "jon",
  "name": "Jon",
  "bot": false,
  "leader": null,
  "roles": [
    "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8"
  ],
  "mutedUntil": null
}

ChannelOverride

Lo que un rol puede hacer distinto en un canal que en el grupo.

CampoTipoSignificado
rolestringEl id del rol.
allowstring[]Lo que puede además aquí.
denystring[]Lo que no puede aquí.
Ejemplo
{
  "role": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8",
  "allow": [
    "send"
  ],
  "deny": []
}

Bell

La campana de un grupo.

CampoTipoSignificado
levelstringQué notificaciones llegan.
  • all — Cada publicación nueva del canal del feed, y @everyone.
  • important — Las publicaciones de la dirección en el canal del feed, y @everyone.
  • off — Nada, salvo que te mencionen con @nombre.
Ejemplo
{
  "level": "important"
}

InviteLink

Un enlace de invitación de un grupo.

CampoTipoSignificado
codestringEl código.
urlstringLa dirección para compartir.
createdByPersono nullQuién lo creó; null si la cuenta está borrada.
createdAtintegerCuándo se creó.
expiresAtintegero nullHasta cuándo vale; null sin fin.
usesintegerCuántas veces se usó.
maxUsesintegero nullCuántas veces se puede usar; null sin límite.
Ejemplo
{
  "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

Adónde lleva un enlace de invitación.

CampoTipoSignificado
communityInviteGroupEl grupo.
memberbooleanSi tu cuenta ya es miembro.
Ejemplo
{
  "community": {
    "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
    "name": "Urban Gardening",
    "members": 312,
    "rules": [
      "Be kind.",
      "No advertising."
    ]
  },
  "member": false
}

InviteGroup

El grupo detrás de un enlace de invitación.

CampoTipoSignificado
idstringEl id.
namestringEl nombre.
membersintegerCuántos miembros tiene.
rulesstring[]Sus normas, que se aceptan al unirse; vacío si no hay.
Ejemplo
{
  "id": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60",
  "name": "Urban Gardening",
  "members": 312,
  "rules": [
    "Be kind.",
    "No advertising."
  ]
}

Joined

La entrada con un enlace de invitación.

CampoTipoSignificado
communitystringEl id del grupo.
Ejemplo
{
  "community": "c81d4e2a-0f3b-4a6c-9e57-1d2b3c4a5f60"
}

LogEntry

Una entrada del registro de la dirección.

CampoTipoSignificado
idstringEl id.
actionstringQué pasó.
  • post_removed — Una publicación.
  • member_removed — Un miembro quitado, antes de 2.16 (fuera durante 90 días).
  • message_removed — Un mensaje en un canal de chat.
  • member_kicked — Una expulsión.
  • member_banned — Un veto.
  • member_unbanned — Un veto levantado.
  • member_timed_out — Un silencio temporal.
  • timeout_lifted — Un silencio levantado.
  • voice_muted — Silenciado en un canal de voz.
  • voice_removed — Desconectado de un canal de voz.
  • bot_added — Un bot entró en el grupo (desde 2.18).
  • bot_removed — Un bot salió del grupo (desde 2.18).
memberPersonA quién afectó.
reasonstringEl motivo; vacío en los mensajes y cuando no se dio ninguno.
bystringo nullEl nombre de quien lo hizo; null si la cuenta está eliminada.
createdAtintegerCuándo.
Ejemplo
{
  "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 veto de un grupo.

CampoTipoSignificado
memberPersonQuién está vetado.
untilintegero nullHasta cuándo; null hasta que se levante.
createdAtintegero nullDesde cuándo; null en vetos anteriores a 2.16.
bystringo nullEl nombre de quien vetó; null si se desconoce.
Ejemplo
{
  "member": {
    "id": "d4c3b2a1-6e5f-4a7b-9c8d-1e2f3a4b5c6d",
    "handle": "jon",
    "name": "Jon",
    "bot": false
  },
  "until": 1759228800000,
  "createdAt": 1758624000000,
  "by": "Mara 🌻"
}

Until

Cuándo termina un silencio o un veto.

CampoTipoSignificado
untilintegero nullEl momento; null en un veto sin fin o en un silencio levantado.
Ejemplo
{
  "until": 1758624600000
}

Tag

Una etiqueta y cuántas publicaciones la llevan.

CampoTipoSignificado
tagstringLa etiqueta, sin #.
postsintegerCuántas publicaciones recientes la llevan.
Ejemplo
{
  "tag": "garden",
  "posts": 58
}

SearchResult

Tres listas, quizá vacías.

CampoTipoSignificado
postsPost[]Publicaciones encontradas, las más nuevas primero.
profilesProfileBrief[]Perfiles encontrados, por nombre corto.
tagsTag[]Etiquetas encontradas, las más usadas primero.
Ejemplo
{
  "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 emoji de esta instancia.

CampoTipoSignificado
namestringEl nombre, tal como aparece entre los dos puntos.
urlstringLa dirección de la imagen, relativa a esta instancia.
Ejemplo
{
  "name": "tellmelo",
  "url": "/api/media?id=e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b"
}

Notification

Una notificación. Una fila puede agrupar varios eventos del mismo tipo.

CampoTipoSignificado
idstringEl identificador de la notificación.
kindstringQué ha pasado.
  • reply — Alguien te ha respondido.
  • like — A alguien le gusta tu publicación.
  • reply_like — Alguien vota a favor de tu respuesta.
  • duel — Alguien te reta al Duelo de feeds, o tu reto ya se ha jugado.
  • reply_pick — El autor de una publicación destaca tu respuesta.
  • repost — Alguien ha compartido tu publicación.
  • follow — Alguien te sigue.
  • mention — Alguien te ha mencionado.
  • group_mention — Alguien ha mencionado un grupo que diriges; text es su nombre.
  • channel_mention — Alguien te mencionó en un canal de chat de uno de tus grupos, también con @everyone; el miembro es el actor, la frase nombra el canal y el grupo, nunca el mensaje.
  • message — Alguien te ha escrito un mensaje.
  • scheduled — Una publicación tuya programada ya ha salido.
  • video — Una publicación tuya que esperaba su vídeo salió o volvió a ser un borrador.
  • reminder — Ha llegado un recordatorio de una publicación guardada.
  • report — Qué ha sido de una denuncia que enviaste.
  • moderation — Una decisión sobre tu cuenta: una advertencia, una restricción, un recurso.
  • team — Trabajo nuevo para el equipo (solo propietarios, admins y moderadores).
  • reward — Una recompensa por invitar está a punto de perderse o se ha perdido.
  • gift — Un regalo del equipo: una suscripción, o chispas para ti o para un grupo que diriges.
  • present — Un regalo de un miembro: chispas o tiempo de suscripción; el miembro es el actor.
  • spark — Unas chispas caducan pronto, o a un grupo que diriges ya no le alcanzan las chispas para sus ventajas.
  • loyalty — Sobre el ritmo de fidelidad: una semana activa cuenta o le falta un día, una recompensa es nueva o está a punto de perderse.
  • impact — Cómo les fue tras un día a tus publicaciones de doce horas, en un solo aviso.
  • discovery — Una invitación al programa Descubierto, o que un puesto en él empieza o termina.
  • group_post — Una nueva publicación en un grupo cuya campana suena para ello.
  • group_moderation — La dirección de un grupo quitó una de tus publicaciones, o a ti, del grupo.
  • group — Algo que un miembro hizo contigo en un grupo: invitarte, aceptarte o rechazarte, hacerte coadministrador, traspasarte el grupo o disolverlo, o solicitar unirse a tu grupo; el miembro es el actor y el nombre del grupo cierra la frase.
  • coauthor — Alguien te ha invitado como coautor de una publicación.
  • partner — Un recordatorio del programa de socios o el fin del distintivo de socio.
  • news — Un artículo nuevo en una región que sigues.
  • pick — Una publicación tuya opta a publicación de la semana o del año, o ha ganado.
  • advent — Se abrió una puerta nueva del calendario de Adviento, se abrió una o la de hoy todavía espera.
  • team_message — Un mensaje que el equipo de tellmelo escribió a miembros elegidos.
  • challenge — Ha empezado un nuevo reto de la semana.
  • nudge — Una sola vez: una publicación que nadie ha respondido aún, o el reto en curso.
  • signin — Un ordenador pregunta si estás iniciando sesión allí ahora mismo.
textstringo nullSolo en denuncias y moderación: el texto correspondiente; si no, null.
actorActorQuién lo hizo.
postIdstringo nullLa publicación de la que trata (null si no trata de ninguna).
readbooleanSi se ha marcado como leída.
moreintegerPor cuántos eventos más vale esta fila, además del nombrado.
createdAtintegerCuándo ocurrió por primera vez.
updatedAtintegerCuándo agrupó otro evento por última vez. La lista se ordena por esto.
Ejemplo
{
  "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én provocó una notificación.

CampoTipoSignificado
handlestringEl nombre corto.
namestringEl nombre visible.
Ejemplo
{
  "handle": "jon",
  "name": "Jon"
}

Conversation

Una fila de tu bandeja de entrada.

CampoTipoSignificado
withstringEl identificador de la otra cuenta: lo que espera /conversations/{with}/messages.
handlestringSu nombre corto.
namestringSu nombre visible.
excerptstringo nullEl comienzo del último mensaje (null si no tiene texto).
truncatedbooleanSi el extracto se acortó.
fromMebooleanSi el último mensaje es tuyo.
lastMessageIdstringEl identificador del último mensaje.
unreadintegerCuántos de sus mensajes no has leído aún.
updatedAtintegerCuándo se escribió el último mensaje.
Ejemplo
{
  "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 mensaje en una conversación.

CampoTipoSignificado
idstringEl identificador del mensaje.
textstringo nullEl texto (null para un mensaje que solo son imágenes).
fromstringEl identificador de la cuenta que lo escribió.
tostringEl identificador de la cuenta a la que se escribió.
readbooleanSi quien lo recibió lo ha leído.
mediaMedia[]Sus imágenes; vacía si no hay ninguna.
replyTostringo nullEl id del mensaje al que responde este (null si no responde a ninguno). Desde 2.2.
createdAtintegerCuándo se envió.
Ejemplo
{
  "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 mensaje tuyo programado para más tarde.

CampoTipoSignificado
idstringLa id del mensaje programado.
tostringLa id de la cuenta que lo recibe.
textstringo nullEl texto, null con cifrado de extremo a extremo.
sendAtintegerCuándo se envía.
statestringSu estado.
  • waiting — Espera su hora.
  • held — Retenido porque terminó la suscripción. Puedes enviarlo tú o borrarlo.
  • failed — No se pudo enviar.
Ejemplo
{
  "id": "3b2a1c0d-9e8f-4a7b-b6c5-d4e3f2a1b0c9",
  "to": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "text": "Happy birthday! 🎂",
  "sendAt": 1758710400000,
  "state": "waiting"
}

ScheduledPost

Una de tus publicaciones que aún no ha salido.

CampoTipoSignificado
idstringEl identificador de la publicación.
textstringo nullEl texto.
communityIdstringo nullEl grupo donde sale (null fuera de los grupos).
publishAtintegero nullCuándo sale (null mientras espera otra cosa).
deleteAtintegero nullCuándo se borra sola (null: nunca).
waitingForstringQué está esperando.
  • time — Su hora.
  • review — La aprobación de un texto escrito para revisión.
  • check — La revisión de la moderación automática.
  • payment — El pago de sus regalos.
createdAtintegerCuándo se escribió.
Ejemplo
{
  "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

Una colección de publicaciones guardadas.

CampoTipoSignificado
idstringLa id de la colección.
namestringSu nombre.
countintegerCuántas publicaciones contiene.
Ejemplo
{
  "id": "6d5c4b3a-2918-4e7f-a1b2-c3d4e5f60718",
  "name": "Recipes",
  "count": 12
}

Event

Un próximo evento de un perfil.

CampoTipoSignificado
idstringLa id del evento.
titlestringEl título.
startsAtintegerInicio.
endsAtintegero nullFin, null sin fin.
placestringo nullEl lugar.
descriptionstringo nullLa descripción.
signupsEventSignupso nullLas inscripciones, null sin inscripción.
Ejemplo
{
  "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

Cuántas personas se han apuntado.

CampoTipoSignificado
countintegerEl número de inscripciones.
goingbooleanSi estás apuntado.
Ejemplo
{
  "count": 14,
  "going": true
}

EventSignup

Alguien que se ha apuntado a uno de tus eventos.

CampoTipoSignificado
idstringLa id de la cuenta.
handlestringEl nombre de usuario.
namestringEl nombre visible.
atintegerCuándo se apuntó.
Ejemplo
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "at": 1758624000000
}

Picture

Una imagen subida.

CampoTipoSignificado
idstringLa id de la imagen.
urlstringDónde se puede ver.
Ejemplo
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9"
}

EmojiPicture

La imagen subida de un emoji.

CampoTipoSignificado
idstringLa id de la imagen.
urlstringDónde se puede ver.
animatedbooleanSi se mueve.
Ejemplo
{
  "id": "8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

OwnEmoji

Uno de tus propios emojis.

CampoTipoSignificado
namestringSu nombre.
urlstringSu imagen.
animatedbooleanSi se mueve.
restingbooleanEn reposo porque ahora la suscripción permite menos emojis: se queda, pero no se puede usar.
Ejemplo
{
  "name": "sunflower",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false,
  "resting": false
}

GroupEmoji

Un emoji de un grupo.

CampoTipoSignificado
namestringSu nombre.
urlstringSu imagen.
animatedbooleanSi se mueve.
Ejemplo
{
  "name": "seedling",
  "url": "/api/media?id=8c7b6a59-4837-4261-9f5e-d4c3b2a1f0e9",
  "animated": false
}

BotEvent

Un evento en un grupo del bot.

CampoTipoSignificado
idstringSu número, ascendente; con él se continúa (since, Last-Event-ID).
typestringQué ocurrió.
  • message.created — Se escribió un mensaje.
  • message.deleted — Se eliminó un mensaje.
  • member.joined — Alguien se unió.
  • member.left — Alguien se fue o fue retirado.
  • voice.joined — Alguien entró en un canal de voz.
  • command — Alguien usó un comando del bot.
  • interaction — Alguien pulsó un botón en un mensaje del bot.
communitystringEl grupo.
channelstringo nullEl canal; null para todo el grupo.
createdAtintegerCuándo ocurrió.
dataobjectLo que lo acompaña, según el tipo: message, member (con reason), command o interaction.
Ejemplo
{
  "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

Un comando de un bot.

CampoTipoSignificado
namestringSu nombre, sin «/».
descriptionstringLo que hace.
Ejemplo
{
  "name": "dice",
  "description": "Rolls a die"
}

VoiceSeat

Un sitio en un canal de voz.

CampoTipoSignificado
urlstringLa dirección del servidor de medios (LiveKit).
tokenstringEl token para este canal, válido unos minutos.
iceServersobject[]Los servidores STUN y TURN para la conexión.
speakbooleanSi el bot puede enviar sonido allí.
videobooleanSi el bot puede enviar vídeo allí.
Ejemplo
{
  "url": "wss://voice.example.org",
  "token": "eyJhbGciOiJIUzI1NiJ9…",
  "iceServers": [
    {
      "urls": [
        "stun:turn.example.org:3478"
      ]
    }
  ],
  "speak": true,
  "video": false
}

Webhook

Uno de tus webhooks.

CampoTipoSignificado
idstringLa id del webhook.
urlstringSu dirección.
kindsstring[]De qué se le avisa.
activebooleanSi recibe entregas. Tras muchos fallos seguidos se desactiva.
lastStatusintegero nullEl estado HTTP de la última entrega.
lastAtintegero nullCuándo fue la última entrega.
failuresintegerFallos seguidos.
Ejemplo
{
  "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 webhook nuevo con su secreto.

CampoTipoSignificado
idstringLa id del webhook.
secretstringEl secreto para las firmas, solo esta vez.
Ejemplo
{
  "id": "1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
  "secret": "whsec_3f9a…"
}

GroupBot

Un bot de un grupo.

CampoTipoSignificado
idstringLa id de la cuenta del bot.
handlestringSu identificador.
namestringSu nombre.
descriptionstringLo que hace, según su dueño.
permissionsstring[]Lo que permite su rol en el grupo.
Ejemplo
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "gardenbot",
  "name": "Garden bot",
  "description": "Reminds the group of watering days.",
  "permissions": [
    "send",
    "view"
  ]
}

VoiceRoom

Un canal de voz con las personas que hay dentro.

CampoTipoSignificado
channelstringLa id del canal.
peopleVoicePerson[]Quién está ahora.
Ejemplo
{
  "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

Alguien en un canal de voz.

CampoTipoSignificado
idstringLa id de la cuenta.
handlestringEl identificador.
namestringEl nombre visible.
mutedbooleanSi tiene el micrófono apagado.
deafbooleanSi no oye nada (por decisión propia).
camerabooleanSi tiene la cámara encendida.
screenbooleanSi comparte la pantalla.
Ejemplo
{
  "id": "a3e1f7c2-54b9-4d0e-8f16-7b2c9d4e1a05",
  "handle": "mara",
  "name": "Mara 🌻",
  "muted": true,
  "deaf": false,
  "camera": false,
  "screen": false
}

GiftDrop

Regalos bajo una publicación, nunca con los nombres de quienes los recogieron.

CampoTipoSignificado
itemstringLo que lleva una plaza.
  • plan — Meses de suscripción (Apoyo).
  • sparks — Chispas.
quantityintegerCuánto lleva cada plaza: meses o chispas.
placesintegerCuántas plazas hay en total.
leftintegerCuántas siguen libres.
audiencestringQuién puede recoger.
  • all — Todos.
  • followers — Solo los seguidores de quien regala.
  • group — Solo los miembros del grupo de la publicación.
newAccountsbooleanSi también pueden recoger cuentas con menos de 7 días.
statusstringEn qué punto está.
  • awaiting_payment — Esperando el pago; la publicación aún no ha salido.
  • open — Todavía quedan plazas por recoger.
  • closed — Terminado: todo recogido, el pago reembolsado o la publicación borrada.
claimedbooleanSi ya tienes una plaza (siempre false en las rutas públicas).
Ejemplo
{
  "item": "plan",
  "quantity": 3,
  "places": 10,
  "left": 4,
  "audience": "followers",
  "newAccounts": false,
  "status": "open",
  "claimed": true
}

OwnGiftDrop

Tus regalos bajo una publicación, con la publicación y cómo se pagaron.

Todos los campos de GiftDrop y, además:

CampoTipoSignificado
postIdstringLa publicación bajo la que están.
fundingstringCómo se pagaron.
  • free — Gratis.
  • quota — Del contingente.
  • payment — Pagado.
createdAtintegerCuándo se crearon.
Ejemplo
{
  "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

Lo que hay en un contingente.

CampoTipoSignificado
monthsintegerMeses de suscripción que quedan por regalar.
sparksintegerChispas que quedan por regalar.
looksQuotaLook[]Estilos de la reserva que quedan por regalar (desde 2.13).
Ejemplo
{
  "months": 120,
  "sparks": 500,
  "looks": [
    {
      "id": "frame-gold",
      "name": "Goldring",
      "kind": "frame",
      "quantity": 25
    }
  ]
}

QuotaLook

Un estilo en la reserva de un socio, con los ejemplares que quedan (desde 2.13).

CampoTipoSignificado
idstringEl ID del estilo; al regalarlo, pásalo como itemId.
namestringEl nombre del estilo.
kindstringEl tipo de estilo.
  • frame — Marco de perfil.
  • background — Efecto de portada.
  • card — Tarjeta de perfil.
quantityintegerCuántos ejemplares quedan.
Ejemplo
{
  "id": "frame-gold",
  "name": "Goldring",
  "kind": "frame",
  "quantity": 25
}

QuotaGift

Un regalo del contingente.

CampoTipoSignificado
itemstringQué se regaló.
  • plan — Meses de suscripción (Apoyo).
  • sparks — Chispas.
  • shop — Un estilo de la reserva (desde 2.13).
quantityintegerCuánto.
itemIdstringo nullEl estilo regalado cuando item es shop; si no, null.
recipientActorA quién.
createdAtintegerCuándo.
Ejemplo
{
  "item": "plan",
  "quantity": 3,
  "itemId": null,
  "recipient": {
    "handle": "jon",
    "name": "Jon"
  },
  "createdAt": 1758627600000
}

MediaItem

Un GIF o vídeo de la biblioteca multimedia (desde 2.14).

CampoTipoSignificado
idstringEl ID; para media al publicar.
kindstringGIF o vídeo.
  • gif — Un GIF, como MP4 sin sonido en bucle.
  • video — Un vídeo en MP4, con sonido.
namestringEl nombre.
keywordsstringLas palabras clave, en minúsculas.
widthintegerAncho en píxeles.
heightintegerAlto en píxeles.
secondsintegerDuración en segundos; 0 en los GIF.
urlstringEl archivo MP4, relativo a esta instancia. Cárgalo con la clave en el encabezado.
posterstringLa imagen de vista previa, también con la clave.
uploaderActorQuién lo subió.
minebooleanSi es tuyo.
sharedbooleanSi está compartido con todos en tellmelo.
anywherebooleanSi también puede aparecer en otros sitios web.
embedEmbedo nullLas direcciones para otros sitios web; null mientras no esté permitido allí.
Ejemplo
{
  "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

Las direcciones para otros sitios web. Funcionan sin clave.

CampoTipoSignificado
pagestringEl reproductor para un <iframe>.
filestringEl archivo MP4 para un reproductor propio.
posterstringLa imagen de vista previa.
codestringEl código listo para insertar.
Ejemplo
{
  "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

Una subida iniciada.

CampoTipoSignificado
uploadstringEl ID de esta subida.
pieceintegerEl tamaño máximo de un fragmento, en bytes.
Ejemplo
{
  "upload": "e7c1a2b3-4d5e-4f60-8a9b-0c1d2e3f4a5b",
  "piece": 4194304
}

UploadPiece

Un fragmento recibido.

CampoTipoSignificado
receivedintegerCuántos bytes han llegado.
itemMediaItemo nullTras el último fragmento, el nuevo GIF o vídeo; si no, null.
Ejemplo
{
  "received": 4194304,
  "item": null
}

Created

La respuesta de una escritura que creó algo.

CampoTipoSignificado
idstringEl identificador de lo que se creó.
scheduledForintegero nullCuándo aparece, si se programó la publicación (si no, null).
deleteAtintegero nullCuándo se borra solo, si se configuró (si no, null).
Ejemplo
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "scheduledFor": null,
  "deleteAt": null
}

DropCreated

La respuesta cuando se ha creado una publicación con regalos.

CampoTipoSignificado
idstringEl identificador de la nueva publicación.
fundingstringCómo se pagan los regalos.
  • free — Gratis.
  • quota — Del contingente.
Ejemplo
{
  "id": "5f0c2a9e-8d41-4b7a-9c3e-2e61d0f4a7b1",
  "funding": "quota"
}

Made

Lo que se acaba de crear o cambiar.

CampoTipoSignificado
idstringEl id; en un enlace de invitación, su código.
Ejemplo
{
  "id": "0d9c8b7a-6f5e-4d3c-2b1a-0f9e8d7c6b5a"
}

Ok

La respuesta de una escritura que no tiene nada que devolver.

CampoTipoSignificado
okbooleanSiempre true.
Ejemplo
{
  "ok": true
}

La descripción legible por una máquina

La tabla detrás de esta página está disponible como OpenAPI en https://api.tellmelo.com/v2/openapi.json.

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

GIF y vídeos en otros sitios web

Lo que un miembro comparte y también permite en otros sitios web puede mostrarlo cualquier sitio: la búsqueda con anywhere=true lo encuentra y su embed tiene las direcciones. Si el miembro lo retira, desaparece de allí en pocos minutos.

Subir en fragmentos

Primero inicia, luego envía el archivo en fragmentos. Divide un archivo más grande en fragmentos de piece bytes, con offset en la posición de cada uno. Tras el último fragmento recibes el GIF o vídeo terminado.

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

Insertar

El reproductor muestra el GIF en bucle o el vídeo con controles y, debajo, el nombre y quién lo compartió. Pon el código de embed.code en la página:

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

Los foros y programas que conocen oEmbed obtienen el código por sí mismos si les das la dirección del reproductor:

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

La clave va en tu servidor, nunca en el código de una página web. Busca y sube a través de tu servidor; las direcciones de embed no necesitan clave.

Selector de GIF para tu web

Con una clave de sitio (Área de desarrolladores → Selector de GIF para tu web), tu web obtiene una búsqueda lista para usar: dos líneas en la página, y un clic en el botón la abre. La clave es pública y solo funciona en las direcciones que introduzcas para ella. El selector solo muestra lo que los miembros han permitido en otros sitios web.

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

Al elegir algo, el botón lanza tellmelo:pick con el elemento: code para insertarlo, file, poster, name y author. Con data-target="#field" pone code directamente en un campo de texto; con data-kind="video" busca vídeos. Si insertas el archivo por tu cuenta, muestra el nombre de la persona que lo compartió.

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

Iniciar sesión con tellmelo

Otros sitios permiten a los miembros iniciar sesión con su cuenta de tellmelo mediante OpenID Connect (código de autorización con PKCE). El sitio solo recibe el nombre de usuario, el correo confirmado y un identificador propio por miembro (sub).

Solicitas una app en «Área de desarrolladores → Iniciar sesión con tellmelo». El equipo revisa cada app; después ves allí el ID de cliente y, para apps con servidor, creas el secreto de cliente, que se muestra una sola vez.

Todo lo que necesita una biblioteca está en el documento de descubrimiento:

https://tellmelo.com/.well-known/openid-configuration
  1. Envía al miembro a /oauth/authorize con response_type=code, client_id, redirect_uri (exactamente como se registró), scope=openid profile email, state, nonce y code_challenge con code_challenge_method=S256.
  2. Canjea el código en menos de un minuto en /oauth/token: grant_type=authorization_code, code, redirect_uri y code_verifier; las apps con servidor envían además el secreto, con autenticación Basic o en el formulario.
  3. El token de ID (RS256, claves en /oauth/jwks) contiene sub, con profile también preferred_username, con email también email y email_verified. El token de acceso vale 10 minutos y solo lee /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
}

No hay tokens de actualización: tellmelo inicia la sesión y no da acceso duradero. Si un miembro quita el sitio o el equipo suspende la app, /oauth/userinfo responde 401 al instante. prompt=none comprueba sin página, prompt=consent vuelve a preguntar.

Lo que esperamos

Rigen las mismas reglas que en todas partes: nada de acoso, nada de spam, nada de contenido ajeno sin derechos. Respondes de lo que publica tu clave.

Muestra los GIF y vídeos de otros en tu sitio web solo si tienen embed, a través de esas direcciones y con el nombre de quien los compartió. Si algo ya no está disponible, deja de mostrarlo. No copies los archivos a una colección propia.

Aviso legalPrivacidadCondiciones de usoEstadoAplicaciones