Eventos

Sobre

Cada evento tiene el mismo sobre; d lleva la carga específica del tipo, descrita a continuación.

CampoTipoSignificado
vintVersión del sobre. Hoy, 1
tstringTipo de evento, de la tabla siguiente
opcreate | update | deletecreate, update (enriquecimiento del mismo id) o delete
idstringIdentidad estable. Deduplica por esto
tsint (ms)Cuándo ocurrió en X, en ms desde la época Unix. X no indica cuándo cambió un perfil, cuándo se siguió o dejó de seguir a alguien, cuándo llegó un seguidor verificado ni cuándo se borró una publicación: en esos eventos es cuándo lo detectamos
sidstringPosición en el flujo para la repetición; presente en el flujo y en el historial
target.idstringId numérico en X de la cuenta monitorizada (para search.match, del autor de la publicación)
target.screen_namestringNombre de usuario de la cuenta monitorizada
target.namestringEl nombre visible de la cuenta
dobjectCarga específica del tipo

Tipos de evento

TipoCategoríaSignificado
tweet.createPublicacionesLa cuenta publicó algo nuevo
tweet.replyPublicacionesRespondió a alguien; reply_to lleva la publicación a la que se responde, con su texto y sus medios
tweet.retweetPublicacionesRepublicó a alguien; retweet_of lleva la publicación original completa
tweet.quotePublicacionesCitó a alguien; quoted lleva la publicación citada completa
tweet.editPublicacionesEditó una publicación; el evento lleva la nueva versión y edit_of la versión que sustituye
tweet.deletePublicacionesUna publicación que la cuenta había publicado ya no está
profile.namePerfilCambió el nombre visible
profile.screen_namePerfilCambió el nombre de usuario
profile.bioPerfilCambió la biografía
profile.locationPerfilCambió la ubicación
profile.urlPerfilCambió el enlace del perfil
profile.avatarPerfilCambió el avatar; old y new son URL de imagen
profile.bannerPerfilCambió el banner; old y new son URL de imagen
profile.pinnedPerfilCambió la publicación fijada; tweet y old_tweet llevan las publicaciones en sí
profile.verifiedPerfilLa insignia de verificación apareció o desapareció
follow.addGrafo de seguimientoLa cuenta empezó a seguir a alguien; user es el perfil completo de esa cuenta
follow.removeGrafo de seguimientoLa cuenta dejó de seguir a alguien
followers.verified.addGrafo de seguimientoUna cuenta verificada empezó a seguirla; user lleva biografía, recuentos, ubicación y fecha de alta
account.statusCuentaLa cuenta pasó a protegida, suspendida o no disponible, o volvió a estar activa
search.matchBúsquedaAlguien publicó algo que coincide con una de tus palabras clave; keyword dice cuál, author es su perfil completo

X no proporciona ninguna marca de tiempo para "empezó a seguir" ni "ganó un seguidor", así que para esos eventos ts es el momento en que detectamos el cambio.

No tienes que recibir todos los tipos de todas las cuentas. Elegir tipos de evento explica cómo recibir solo algunos, por ejemplo solo los nuevos seguidores verificados.

Cargas

Cinco formas de carga cubren los dieciocho tipos.

Carga Tweet

El d de tweet.create, tweet.reply, tweet.retweet y tweet.quote, y la base de search.match.

CampoTipoSignificado
tweet_idstringEl id de la publicación, como cadena
kindtweet | reply | retweet | quoteQué clase de publicación es
textstringTexto completo (incluidas las publicaciones largas)
langstring | nullIdioma detectado por X
authorUserLa cuenta que la publicó, como User completo — el mismo objeto que el autor de un search.match: nombre de usuario, nombre, bio, avatar, banner, contadores, verificación, ubicación, enlace y fecha de alta. En una primera trama escueta es la cuenta tal como se leyó por última vez; el update la trae tal como se leyó con la publicación
reply_toBrief+ | nullPara respuestas: la publicación a la que se responde — un Resumen más screen_name, tweet_id y user_id de su autor
retweet_ofBrief | nullPara republicaciones: la publicación original
quotedBrief | nullPara citas: la publicación citada
mediastring[]URL de imagen simples, una por elemento multimedia
media_itemsMedia[]Cada elemento multimedia con tipo, variantes de video y dimensiones
urlsstring[]Enlaces expandidos de la publicación
articleArticle | nullEn publicaciones que enlazan un artículo de X: el artículo
counts{reply, rt, like, quote, bookmark}Recuentos de respuestas, republicaciones, me gusta, citas y marcadores en el momento en que la leímos
viewsint | nullRecuento de visualizaciones, cuando X lo expone
urlstringEnlace canónico a la publicación
fullboolfalse en una primera trama create escueta; true una vez que el evento lleva la publicación entera
kind_finalbooltrue cuando kind es definitivo. false solo en una primera trama escueta cuyo kind es tweet: la publicación aún puede resultar ser una cita, y el update del mismo id lo resuelve
kind_wastweet | null (update only)Solo en el update que fija el tipo de una publicación, y solo cuando la primera trama decía otra cosa: el tipo que tenía esa trama (tweet para una publicación que resultó ser una cita)
edit_ofBrief | nullEn tweet.edit: la versión a la que esta sustituye (su id, y su texto y autor cuando los teníamos)
ejemplo
{
  "v": 1,
  "t": "tweet.create",
  "op": "create",
  "id": "tweet:2097879002992070835",
  "ts": 1789012345678,
  "sid": "1789012346012-0",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "kind": "tweet",
    "text": "Ash-covered shoes and a president in crisis…",
    "lang": "en",
    "author": {
      "id": "1652541",
      "screen_name": "Reuters",
      "name": "Reuters",
      "bio": "Top and breaking news, pictures and videos from Reuters.",
      "avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
      "banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
      "followers": 25900000,
      "following": 1150,
      "tweets": 1080000,
      "location": "Around the world",
      "url": "https://www.reuters.com",
      "verified": true,
      "verified_type": "Business",
      "protected": false,
      "created_at": "2007-03-20T17:46:05Z",
      "category": null
    },
    "reply_to": null,
    "retweet_of": null,
    "quoted": null,
    "media": [
      "https://pbs.twimg.com/media/….jpg"
    ],
    "media_items": [
      {
        "type": "photo",
        "url": "https://pbs.twimg.com/media/….jpg",
        "expanded_url": "https://x.com/Reuters/status/2097879002992070835/photo/1",
        "width": 1200,
        "height": 675
      }
    ],
    "urls": [
      "https://reut.rs/…"
    ],
    "counts": {
      "reply": 12,
      "rt": 40,
      "like": 131,
      "quote": 3,
      "bookmark": 9
    },
    "views": 20411,
    "url": "https://x.com/Reuters/status/2097879002992070835",
    "full": true,
    "kind_final": true
  }
}

Una primera trama create es deliberadamente escueta: lleva el id, el autor (author, la cuenta tal como se leyó por última vez) y el texto, que puede venir recortado, para poder salir en el momento en que se ve la publicación; url ya apunta a la publicación. En ese momento una cita no siempre se distingue de una publicación original, así que una trama así dice tweet.create con kind_final: false. El update que sigue con el mismo id trae la carga completa de arriba y el tipo definitivo: tweet.quote con kind_was: "tweet" si era una cita.

la misma publicación tal como se entregó por primera vez, antes del enriquecimiento
{
  "v": 1,
  "t": "tweet.create",
  "op": "create",
  "id": "tweet:2097879002992070835",
  "ts": 1789012345678,
  "sid": "1789012346012-0",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "kind": "tweet",
    "text": "Ash-covered shoes and a president in crisis…",
    "author": {
      "id": "1652541",
      "screen_name": "Reuters",
      "name": "Reuters",
      "bio": "Top and breaking news, pictures and videos from Reuters.",
      "avatar": "https://pbs.twimg.com/profile_images/1874154135869616128/nJDmubGJ_normal.jpg",
      "banner": "https://pbs.twimg.com/profile_banners/1652541/1573687397",
      "followers": 25900000,
      "following": 1150,
      "tweets": 1080000,
      "location": "Around the world",
      "url": "https://www.reuters.com",
      "verified": true,
      "verified_type": "Business",
      "protected": false,
      "created_at": "2007-03-20T17:46:05Z",
      "category": null
    },
    "url": "https://x.com/Reuters/status/2097879002992070835",
    "full": false,
    "kind_final": false
  }
}

Carga de eliminación

El d de tweet.delete. Solo se envía para una publicación que habíamos visto y que ya no está. Su ts es cuándo se detectó el borrado; la hora de la propia publicación está en su trama create anterior.

CampoTipoSignificado
tweet_idstringEl id de la publicación eliminada
urlstringDónde solía estar
ejemplo
{
  "v": 1,
  "t": "tweet.delete",
  "op": "delete",
  "id": "tweet:2097879002992070835:delete",
  "ts": 1789012345678,
  "sid": "…",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "tweet_id": "2097879002992070835",
    "url": "https://x.com/Reuters/status/2097879002992070835"
  }
}

Carga de cambio de perfil

El d de cada evento profile.*. Para estos, op es update.

CampoTipoSignificado
fieldstringQué campo del perfil cambió; la misma palabra que sigue a profile. en el tipo
oldanyEl valor anterior
newanyEl valor nuevo
tweetBrief (pinned only)Para profile.pinned: la publicación recién fijada
old_tweetBrief (pinned only)Para profile.pinned: la publicación fijada anteriormente, si la teníamos
ejemplo
{
  "v": 1,
  "t": "profile.bio",
  "op": "update",
  "id": "profile:1652541:bio:9c1d2e3f4a5b",
  "ts": 1789012400000,
  "sid": "…",
  "target": {
    "id": "1652541",
    "screen_name": "Reuters",
    "name": "Reuters"
  },
  "d": {
    "field": "bio",
    "old": "Top news and analysis from around the world.",
    "new": "Top news, analysis and video from around the world."
  }
}

Carga de seguimiento

El d de follow.add, follow.remove y followers.verified.add.

CampoTipoSignificado
userUserLa otra cuenta, como Usuario completo
ejemplo
{
  "v": 1,
  "t": "follow.add",
  "op": "create",
  "id": "follow:44196397:12:add:496948",
  "ts": 1789012400000,
  "sid": "…",
  "target": {
    "id": "44196397",
    "screen_name": "elonmusk",
    "name": "Elon Musk"
  },
  "d": {
    "user": {
      "id": "12",
      "screen_name": "jack",
      "name": "jack",
      "bio": "…",
      "avatar": "https://pbs.twimg.com/profile_images/…",
      "banner": null,
      "followers": 6400000,
      "following": 4200,
      "tweets": 29000,
      "location": "",
      "url": null,
      "verified": true,
      "verified_type": "blue",
      "protected": false,
      "created_at": "2006-03-21T20:50:14Z",
      "category": null
    }
  }
}

Carga de estado de la cuenta

El d de account.status. Un estado es active, protected (publicaciones visibles solo para seguidores aprobados), suspended (por X) o unavailable (desactivada, eliminada o no visible por otro motivo). ts es cuándo detectamos el cambio.

CampoTipoSignificado
oldactive | protected | suspended | unavailableEl estado anterior
newactive | protected | suspended | unavailableEl estado actual
reasonstring | nullEl texto de X, si lo da (por ejemplo Suspended)
ejemplo
{
  "v": 1,
  "t": "account.status",
  "op": "update",
  "id": "account:9000002:status:active>suspended:497010",
  "ts": 1789236000000,
  "sid": "…",
  "target": {
    "id": "9000002",
    "screen_name": "some_account",
    "name": "Some Account"
  },
  "d": {
    "old": "active",
    "new": "suspended",
    "reason": "Suspended"
  }
}

El d de search.match: una carga Tweet más tres campos sobre la coincidencia. El target del sobre es el autor de la publicación, que no tiene por qué ser uno de tus objetivos.

CampoTipoSignificado
keyword.idintId de la palabra clave que coincidió
keyword.querystringSu consulta
keyword.labelstring | nullSu etiqueta, si le pusiste una
authorUserEl perfil completo del autor
author_is_targetbooltrue si el autor es además una cuenta monitorizada en este sistema
…TweetPayloadTodos los campos de la carga Tweet
ejemplo
{
  "v": 1,
  "t": "search.match",
  "op": "create",
  "id": "search:12:2097900000000000000",
  "ts": 1789012500000,
  "sid": "…",
  "target": {
    "id": "9000001",
    "screen_name": "some_trader",
    "name": "Some Trader"
  },
  "d": {
    "tweet_id": "2097900000000000000",
    "kind": "tweet",
    "text": "$SOL breaking out…",
    "lang": "en",
    "author": {
      "id": "9000001",
      "screen_name": "some_trader",
      "name": "Some Trader",
      "bio": "…",
      "followers": 1200,
      "verified": false,
      "…": "…"
    },
    "keyword": {
      "id": 12,
      "query": "($SOL OR \"Solana\") -filter:retweets",
      "label": "solana"
    },
    "author_is_target": false,
    "media": [],
    "media_items": [],
    "urls": [],
    "url": "https://x.com/some_trader/status/2097900000000000000",
    "full": true
  }
}