Saltar al contenido principal

Account Activity API v2

¡Account Activity API v2 ya está disponible en Pro!

Descripción general

La Account Activity API (AAA) proporciona una forma de recibir eventos en tiempo real relacionados con cuentas de usuario de X mediante webhooks. Al suscribir cuentas de usuario específicas a un webhook preconfigurado, tu aplicación puede recibir notificaciones de diversas actividades, como Posts, Mensajes Directos, likes, follows, bloqueos y más, provenientes de una o varias de tus cuentas propias o suscritas, a través de una única conexión.
Esta API se utiliza comúnmente para crear aplicaciones que necesitan reaccionar al instante a las acciones de los usuarios o mantener un estado actualizado basado en la actividad del usuario. Recibirás todas las actividades relacionadas que se indican a continuación para cada suscripción de usuario en tu registro de webhook:

Tipos de actividad

  • Posts (del usuario)
  • Eliminaciones de Post (del usuario)
  • @menciones (del usuario)
  • Respuestas (al usuario o del usuario)
  • Reposts (del usuario o sobre el usuario)
  • Posts con cita (del usuario o sobre el usuario)
  • Reposts de Posts con cita (del usuario o sobre el usuario)
  • Likes (del usuario o sobre el usuario)
  • Follows (del usuario o sobre el usuario)
  • Unfollows (del usuario o sobre el usuario)
  • Bloqueos (del usuario o sobre el usuario)
  • Desbloqueos (del usuario o sobre el usuario)
  • Silenciamientos (del usuario o sobre el usuario)
  • Anulación de silenciamiento (del usuario o sobre el usuario)
  • Mensajes Directos enviados (por el usuario)
  • Mensajes Directos recibidos (por el usuario)
  • Indicadores de escritura (para el usuario)
  • Confirmaciones de lectura (para el usuario)
  • Revocaciones de suscripción (por el usuario)
Nota: No entregamos data de la cronología de inicio a través de la Account Activity API. Use el endpoint User Posts timeline by User ID para obtener esta data.

Resumen de funciones

NivelPrecioNúmero de suscripciones únicasNúmero de webhooks
Pro$5,000/mes31
EnterpriseContactar a ventas5000+5+
Este documento se centra en la gestión de las suscripciones de usuarios asociadas a tus webhooks mediante los endpoints de la Account Activity API v2.

Administrar suscripciones

La Account Activity API envía mensajes JSON mediante webhooks cada vez que se producen eventos asociados con cuentas de X suscritas a su servicio. X entrega esas actividades a su webhook registrado. En los siguientes pasos, aprenderá a configurar y administrar suscripciones para cuentas de usuario.

1. Crea una X App

Crea una X App con una cuenta de desarrollador aprobada desde el portal de desarrolladores. Si creas la App en nombre de tu empresa, usa una cuenta corporativa de X.
  • Habilita “Read, Write, and Access direct messages” en la pestaña de permisos de la página de tu App.
  • En la pestaña “Keys and Access Tokens”, toma nota del Consumer Key (API Key), Consumer Token (API Secret) y Bearer Token de tu App.
  • Genera el Access Token y el Access Token Secret de tu App. Estos son necesarios para suscribirte a cuentas de usuario.
  • Revisa Obtaining Access Tokens si no estás familiarizado con X Sign-in y los contextos de usuario.
  • Anota el id numérico de tu App desde la página “Apps” en el portal de desarrolladores. Esto es necesario al solicitar acceso a Account Activity API.

2. Obtener acceso a la Account Activity API

La Account Activity API está disponible únicamente en el nivel Enterprise. Envíe una solicitud de acceso a Enterprise a través del portal de desarrolladores.

3. Registrar un webhook

Para recibir eventos de actividad de cuenta, debe registrar un webhook con una URL HTTPS accesible públicamente. Consulte la documentación de la API de Webhooks v2 para obtener detalles sobre cómo desarrollar una App consumidora de webhooks, registrar un webhook, protegerlo y manejar las comprobaciones de desafío-respuesta (CRC).
  • Asegúrese de que su webhook esté configurado para aceptar solicitudes POST con cargas de eventos codificadas en JSON.
  • Obtenga el webhook_id de la respuesta al registrar el webhook, ya que es necesario para gestionar las suscripciones.

4. Validar la configuración

Para comprobar que tu App y tu webhook están configurados correctamente:
  • Suscribe una cuenta de usuario a tu webhook (consulta “Adding a Subscription” más abajo).
  • Marca como favorito un Post publicado por una de las cuentas de X a las que tu App está suscrita.
  • Deberías recibir un payload de favorite_events mediante una solicitud POST a la URL de tu webhook.
  • Nota: La entrega de eventos puede tardar hasta 10 segundos en comenzar tras agregar una suscripción.

Notas importantes

  • Autenticación: Al suscribir usuarios, usa la consumer key, consumer secret, access token y access token secret de la cuenta del usuario.
  • Mensajes Directos: Todos los Mensajes Directos entrantes y salientes (enviados mediante POST /2/dm_conversations/with/:participant_id/messages) se entregan por webhooks para mantener tu App al tanto de toda la actividad de MD.
  • Duplicación de eventos:
    • Si dos usuarios suscritos están en la misma conversación de MD, tu webhook recibe eventos duplicados (uno por usuario). Usa el campo for_user_id para distinguirlos.
    • Si varias Apps comparten la misma URL de webhook y el mismo usuario, los eventos se envían varias veces (una por App).
    • Tu App debe desduplicar los eventos usando el event ID para manejar duplicados ocasionales.
  • Código de ejemplo: Consulta el Account Activity API Setup para una App web que muestra eventos de webhook.

Gestión de usuarios suscritos (API v2)

Una vez que tengas un webhook registrado con un webhook_id válido, puedes administrar las suscripciones de usuarios para recibir la actividad de sus cuentas. Utiliza los siguientes endpoints para añadir, consultar o eliminar suscripciones. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Suscribe al usuario autenticado para recibir eventos mediante el webhook especificado.
Authentication: OAuthUser (flujo de OAuth de 3 fases requerido, que representa al usuario que se suscribe).
  • Consumer Key: p. ej., xvz1evFS…
  • Access Token: p. ej., 370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_idEl id del webhook con el que asociar la suscripción.
Request:
bash
curl --request POST --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Respuestas:
  • Correcto (200 OK):
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • Error (400 Bad Request):
MotivoDescripción
WebhookIdInvalidEl webhook_id proporcionado no se encontró o no está asociado con la App.
DuplicateSubscriptionFailedYa existe una suscripción para este usuario para el webhook_id especificado.
SubscriptionLimitExceededLa aplicación alcanzó su límite de suscripciones en todos los webhooks.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Descripción: Comprueba si el usuario autenticado está suscrito al webhook especificado.
Autenticación: OAuthUser (se requiere flujo de OAuth de 3 fases).
Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook que se desea comprobar.
Solicitud:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all' \
--header 'authorization: OAuth oauth_consumer_key="<CONSUMER_KEY>", oauth_nonce="GENERATED", oauth_signature="GENERATED", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATED", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Respuestas:
  • Correcto (200 OK):
  • JSON
{
  "data": {
    "subscribed": true // o false
  }
}
  • Error (400 Solicitud incorrecta):
MotivoDescripción
WebhookIdInvalidEl webhook_id proporcionado no se encontró o no está asociado con la App.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: Desactiva la suscripción para un id de usuario específico y detiene la entrega de eventos al webhook.
Authentication: OAuth2 App only Bearer Token.
  • Bearer Token: p. ej., AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Path Parameters:
ParameterDescription
webhook_idEl id del webhook que contiene la suscripción.
user_idEl id numérico del usuario al que se dará de baja.
Request:
bash
curl --request DELETE --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/:USER_ID/all' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Respuestas:
  • Correcto (200 OK):
  • JSON
{
  "data": {
    "subscribed": false
  }
}
  • Fallo (400 Bad Request):
MotivoDescripción
SubscriptionNotFoundNo existe una suscripción para el user_id especificado en el webhook_id indicado.
WebhookIdInvalidEl webhook_id proporcionado no se encontró o no está asociado con la App.
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: Recupera una lista de todos los id de usuarios que actualmente están suscritos al webhook especificado.
Authentication: OAuth2 App only Bearer Token.
Path Parameters:
ParameterDescription
webhook_idEl id del webhook para el que se desean listar las suscripciones.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Respuestas:
  • Correcto (200 OK):
  • JSON
{
  "data": {
    "application_id": "<tu id de app>",
    "webhook_id": "<id de webhook>",
    "webhook_url": "<la URL de callback del webhook>",
    "subscriptions": [
      { "user_id": "<id_de_usuario_1>" },
      { "user_id": "<id_de_usuario_2>" }
    ]
  }
}
  • Error (400 Bad Request):
MotivoDescripción
WebhookIdInvalidEl webhook_id proporcionado no se encontró o no está asociado con la App.

Endpoint: GET /2/account_activity/subscriptions/count
Description: Devuelve el recuento total de suscripciones activas y el límite aprovisionado para la aplicación autenticada.
Authentication: OAuth2 App only Bearer Token.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Respuestas:
  • Correcto (200 OK):
  • JSON
{
  "data": {
    "account_name": "<nombre de tu aplicación>",
    "provisioned_count": "<límite de suscripción asignado>",
    "subscriptions_count_all": "<recuento actual de suscripciones activas>",
    "subscriptions_count_direct_messages": "0" // Las suscripciones solo de mensajes directos ya no son compatibles
  }
}
AAAv2 proporciona la funcionalidad de reproducción que permite recuperar eventos pasados en un intervalo de tiempo especificado y volver a entregarlos a tu webhook. Esto es útil para recuperar eventos perdidos debido a interrupciones. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Descripción: Inicia un trabajo de reproducción Autenticación: OAuth2 App only Bearer Token Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook en el que iniciar la reproducción
Parámetros de query:
ParámetroDescripción
from_dateLa marca de tiempo UTC más antigua (inicial) desde la cual se proporcionarán los eventos; debe estar en el formato ‘yyyymmddhhmm’. La marca de tiempo tiene granularidad de minutos y es inclusiva (p. ej., 12:00 incluye el minuto 00). Los tiempos válidos deben estar dentro de las últimas 24 horas (hora UTC) y no más recientes que 31 minutos antes del momento actual. Se recomienda que from_date y to_date estén dentro de ~2 horas.
to_dateLa marca de tiempo UTC más reciente (final) hasta la cual se proporcionarán los eventos; debe estar en el formato ‘yyyymmddhhmm’. La marca de tiempo tiene granularidad de minutos y es exclusiva (p. ej., 12:30 no incluye el minuto 30 de la hora). Los tiempos válidos deben estar dentro de las últimas 24 horas (hora UTC) y no más recientes que 10 minutos antes del momento actual.
Respuestas: Éxito:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": <REPLAY_JOB_ID>",
    "created_at": "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Failures:
ReasonDescription
QueryParamInvalidfrom_date es anterior a 24 horas respecto de la hora actual.
QueryParamInvalidfrom_date es más reciente que to_date.
QueryParamInvalidfrom_date está en el futuro.
QueryParamInvalidto_date está en el futuro.
QueryParamInvalidfrom_date o to_date no tiene el formato correcto.
CrcValidationFailedSe recibió una respuesta incorrecta desde la URL del webhook durante la validación CRC.
ReplayConflictErrorYa hay un trabajo de reproducción en curso para el webhook especificado.
WebhookIdInvalidEl webhook_id proporcionado no es válido o no está asociado con la App.

Mensajes de finalización de trabajo

Una vez que su trabajo de reproducción se complete correctamente, X enviará el siguiente evento de finalización de trabajo. Al recibir este evento, el trabajo habrá terminado de ejecutarse y podrá enviar otro.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "Trabajo completado con éxito",
    "job_id": "<JOB_ID>"
  }
}
Si tu job no se completa correctamente, devolveremos el siguiente mensaje para invitarte a reintentar tu Replay Job. Una vez que recibas este evento, el job habrá terminado de ejecutarse y podrás enviar otro.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "El trabajo no pudo entregar todos los eventos, vuelva a intentar su trabajo de reproducción",
    "job_id": "<JOB_ID>"
  }
}

Estructura del objeto de datos de actividad de la cuenta

ObjetoDetalles
for_user_idIdentifica la suscripción de usuario a la que está relacionado el evento.
is_blocked_by(Condicional) Solo se muestra para eventos de mención de Post si el usuario que menciona está bloqueado por el usuario suscrito.
sourceEl usuario que realiza la actividad (p. ej., el usuario que sigue, bloquea o silencia).
targetEl usuario al que se aplica la actividad (p. ej., el usuario al que siguen, bloquean o silencian).

Actividades disponibles

Tipo de mensajeDetalles
tweet_create_eventsEstado de Post para Posts, Retweets, respuestas, @mentions, Quote Tweets o Retweet de Quote Tweets.
favorite_eventsEvento de like con usuario y objetivo.
follow_eventsEvento de seguir con usuario y objetivo.
unfollow_eventsEvento de dejar de seguir con usuario y objetivo.
block_eventsEvento de bloqueo con usuario y objetivo.
unblock_eventsEvento de desbloqueo con usuario y objetivo.
mute_eventsEvento de silenciar con usuario y objetivo.
unmute_eventsEvento de reactivar sonido con usuario y objetivo.
user_eventEventos de revocación cuando un usuario elimina la autorización de la App (suscripción eliminada automáticamente).
direct_message_eventsEstado de mensaje directo (DM) para mensajes enviados o recibidos.
direct_message_indicate_typing_eventsEvento de escritura en DM con usuario y objetivo.
direct_message_mark_read_eventsEvento de lectura en DM con usuario y objetivo.
tweet_delete_eventsAviso de Posts eliminados para fines de cumplimiento.
spaces_eventsActualmente no compatible. Próximamente.

Ejemplos de cargas útiles

A continuación se muestran ejemplos de cargas útiles para cada evento de Account Activity.

tweet_create_events (Posts, Retweets, Respuestas, Quote Tweets)

{
  "for_user_id": "2244994945",
  "tweet_create_events": [
    {
      <Objeto Tweet>
    }
  ]
}

tweet_create_events (@mentions)

{
  "for_user_id": "2244994945",
  "user_has_blocked": "false",
  "tweet_create_events": [
    {
      <Objeto Tweet>
    }
  ]
}

eventos_favoritos

{
  "for_user_id": "2244994945",
  "favorite_events": [{
    "id": "a7ba59eab0bfcba386f7acedac279542",
    "created_at": "Mon Mar 26 16:33:26 +0000 2018",
    "timestamp_ms": 1522082006140,
    "favorited_status": {
      <Objeto Tweet>
    },
    "user": {
      <Objeto de Usuario>
    }
  }]
}

eventos_de_follow

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <Objeto de usuario>
    },
    "source": {
      <Objeto de usuario>
    }
  }]
}

eventos_dejar_de_seguir

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <Objeto de Usuario>
    },
    "source": {
      <Objeto de Usuario>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <Objeto de usuario>
    },
    "target": {
      <Objeto de usuario>
    }
  }]
}

desbloquear_eventos

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <Objeto de usuario>
    },
    "target": {
      <Objeto de usuario>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <Objeto de usuario>
      },
      "target": {
        <Objeto de usuario>
      }
    }
  ]
}

unmute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <Objeto de usuario>
      },
      "target": {
        <Objeto de usuario>
      }
    }
  ]
}

user_event

{
  "user_event": {
    "revoke": {
      "date_time": "2018-05-24T09:48:12+00:00",
      "target": {
        "app_id": "13090192"
      },
      "source": {
        "user_id": "63046977"
      }
    }
  }
}

direct_message_events

{
  "for_user_id": "4337869213",
  "direct_message_events": [{
    "type": "message_create",
    "id": "954491830116155396",
    "created_timestamp": "1516403560557",
    "message_create": {
      "target": {
        "recipient_id": "4337869213"
      },
      "sender_id": "3001969357",
      "source_app_id": "13090192",
      "message_data": {
        "text": "¡Hola Mundo!",
        "entities": {
          "hashtags": [],
          "symbols": [],
          "user_mentions": [],
          "urls": []
        }
      }
    }
  }],
  "apps": {
    "13090192": {
      "id": "13090192",
      "name": "FuriousCamperTestApp1",
      "url": "https://x.com/furiouscamper"
    }
  },
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE las opiniones son mías",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 22,
      "friends_count": 45,
      "statuses_count": 494,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "4337869213": {
      "id": "4337869213",
      "created_timestamp": "1448312972328",
      "name": "Harrison Test",
      "screen_name": "Harris_0ff",
      "location": "Burlington, MA",
      "protected": false,
      "verified": false,
      "followers_count": 8,
      "friends_count": 8,
      "statuses_count": 240,
      "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
    }
  }
}

direct_message_indicate_typing_events

{
  "for_user_id": "4337869213",
  "direct_message_indicate_typing_events": [{
    "created_timestamp": "1518127183443",
    "sender_id": "3284025577",
    "target": {
      "recipient_id": "3001969357"
    }
  }],
  "users": {
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE las opiniones son mías",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 47,
      "statuses_count": 509,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    },
    "3284025577": {
      "id": "3284025577",
      "created_timestamp": "1437281176085",
      "name": "Bogus Bogart",
      "screen_name": "bogusbogart",
      "protected": true,
      "verified": false,
      "followers_count": 1,
      "friends_count": 4,
      "statuses_count": 35,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/763383202857779200/ndvZ96mE_normal.jpg"
    }
  }
}

direct_message_mark_read_events

{
  "for_user_id": "4337869213",
  "direct_message_mark_read_events": [{
    "created_timestamp": "1518452444662",
    "sender_id": "199566737",
    "target": {
      "recipient_id": "3001969357"
    },
    "last_read_event_id": "963085315333238788"
  }],
  "users": {
    "199566737": {
      "id": "199566737",
      "created_timestamp": "1286429788000",
      "name": "Le Braat",
      "screen_name": "LeBraat",
      "location": "Denver, CO",
      "description": "datos de día en @X, diseño al atardecer",
      "protected": false,
      "verified": false,
      "followers_count": 299,
      "friends_count": 336,
      "statuses_count": 752,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/936652894371119105/YHEozVAg_normal.jpg"
    },
    "3001969357": {
      "id": "3001969357",
      "created_timestamp": "1422556069340",
      "name": "Jordan Brinks",
      "screen_name": "furiouscamper",
      "location": "Boulder, CO",
      "description": "Alter Ego - X PE las-opiniones-son-propias",
      "url": "https://t.co/SnxaA15ZuY",
      "protected": false,
      "verified": false,
      "followers_count": 23,
      "friends_count": 48,
      "statuses_count": 510,
      "profile_image_url_https": "https://pbs.twimg.com/profile_images/851526626785480705/cW4WTi7C_normal.jpg"
    }
  }
}

tweet_delete_events

{
  "for_user_id": "930524282358325248",
  "tweet_delete_events": [
    {
      "status": {
        "id": "1045405559317569537",
        "user_id": "930524282358325248"
      },
      "timestamp_ms": "1432228155593"
    }
  ]
}

Compatibilidad con Posts de formato largo

La Account Activity API v2 ahora es compatible con los Posts de formato largo, que son aquellos que superan los 280 caracteres. Cuando un Post de formato largo se incluye en una carga útil de tweet_create_events, el campo text contiene los primeros 140 caracteres (o menos) y el campo truncated se establece en true. El contenido completo del Post se entrega en el objeto extended_tweet, que incluye:
  • full_text: El texto completo del Post, incluidos todos los caracteres más allá del límite de 280.
  • entities: Cualquier entidad (p. ej., hashtags, URL, menciones de usuario, símbolos) que aparezca en el texto completo, incluidas las que se encuentren después del carácter 280.
  • display_text_range: El rango de caracteres que se debe mostrar, considerando el texto completo.
Esto garantiza que las aplicaciones puedan procesar todo el contenido de los Posts de formato largo, incluidas las menciones u otras entidades que aparezcan más adelante en el texto. A continuación se muestra un ejemplo de una carga útil de tweet_create_events para un Post de formato largo:
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "El Mecanismo de Anticitera: Una Ventana al Ingenio Antiguo Descubierto en 1901 entre los restos de un barco romano de… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "El Mecanismo de Anticitera: Una Ventana al Ingenio Antiguo Descubierto en 1901 entre los restos de un barco romano frente a la isla griega de Anticitera, el Mecanismo de Anticitera es frecuentemente aclamado como la primera computadora analógica del mundo. Este intrincado dispositivo de bronce, que data de alrededor del 100 a.C., ha cautivado a historiadores, arqueólogos y científicos con su diseño sofisticado y propósito misterioso. El mecanismo consiste en un sistema complejo de engranajes, meticulosamente elaborado para realizar cálculos que permanecen asombrosamente avanzados para su época. Su descubrimiento desafió suposiciones arraigadas sobre las capacidades tecnológicas del mundo antiguo. La función principal del Mecanismo de Anticitera parece haber sido astronómica. Podía predecir las posiciones del sol, la luna y posiblemente los planetas, rastrear eclipses lunares y solares, e incluso calcular las fechas de los Juegos Olímpicos. Los diales y punteros del dispositivo, junto con inscripciones en griego antiguo, sugieren que era una herramienta tanto para la investigación científica como para eventos culturales. Su nivel de precisión, comparable al de la relojería del siglo XIX, subraya el notable ingenio de sus creadores, probablemente del mundo helenístico. A pesar de décadas de estudio, muchas preguntas permanecen. ¿Quién lo construyó, y para quién? ¿Fue una obra maestra singular o parte de una tradición más amplia de dispositivos mecánicos perdidos en la historia? Las imágenes de rayos X y las técnicas computacionales modernas han revelado mucho sobre su funcionamiento interno, sin embargo, el alcance completo de sus capacidades aún se debate. Algunos proponen que se usaba para predicciones astrológicas, mientras que otros lo ven como una herramienta de enseñanza para astrónomos. El Mecanismo de Anticitera se erige como un testimonio de la curiosidad e innovación humana, conectando los mundos antiguo y moderno. Nos recuerda que incluso en la antigüedad, las personas buscaban entender el cosmos con herramientas que rivalizan con la complejidad de la tecnología actual. Su misterio perdurable continúa inspirando asombro e investigación, convirtiéndolo en uno de los artefactos más notables jamás desenterrados.\n@xai\n@HistoryInPics",
        "display_text_range": [
          0,
          2051
        ],
        "entities": {
          "hashtags": [],
          "urls": [],
          "user_mentions": [
            {
              "screen_name": "xai",
              "name": "xAI",
              "id": 1661523610111193000,
              "id_str": "1661523610111193088",
              "indices": [
                2032,
                2036
              ]
            },
            {
              "screen_name": "HistoryInPics",
              "name": "History Photographed",
              "id": 1582853809,
              "id_str": "1582853809",
              "indices": [
                2037,
                2051
              ]
            }
          ],
          "symbols": []
        }
      },
      ...
      "entities": {
        "hashtags": [],
        "urls": [
          {
            "url": "https://t.co/bzbEKj8cd8",
            "expanded_url": "https://twitter.com/i/web/status/1924465506158878979",
            "display_url": "twitter.com/i/web/status/1…",
            "indices": [
              117,
              140
            ]
          }
        ],
        "user_mentions": [],
        "symbols": []
      },
      ...
    }
  ]
}

Account Activity API: migración de Enterprise heredado a v2

Consulta nuestra guía de migración.

Preguntas frecuentes

¿Cuáles son las ventajas de usar la Account Activity API? La Account Activity API utiliza webhooks para entregar datos en tiempo real sin requerir una conexión abierta (a diferencia de las APIs de stream) ni sondeos frecuentes (a diferencia de las APIs REST). Los beneficios incluyen:
  • Velocidad: Entrega datos a la velocidad de X.
  • Simplicidad: Proporciona todos los eventos de la cuenta a través de una única conexión de webhook, incluidos Posts, @menciones, respuestas, Reposts, Tweets con cita, likes, MD, follows, blocks y mutes.
  • Escala: Admite todas las actividades para cuentas gestionadas sin límites de tasa ni topes de eventos (nivel Enterprise).
Necesito entornos de desarrollo, staging y producción para Account Activity API, ¿es posible? Sí. Puedes registrar múltiples URL de webhook y gestionar suscripciones por separado a través de la V2 Webhooks API. ¿Tienen alguna guía paso a paso sobre cómo configurar la Account Activity API? Sí. Consulta la guía de introducción a Webhooks y la aplicación de ejemplo de Account Activity API. ¿Qué autenticación tengo que usar con la Account Activity API? Los requisitos de autenticación se especifican por endpoint. Revisa la sección de autenticación para más detalles. ¿Recibiré actividades duplicadas si estoy suscrito a usuarios que interactúan entre sí? Sí. Si tu App tiene suscripciones para el Usuario A y el Usuario B, y el Usuario A menciona al Usuario B en un Post, tu webhook recibe dos eventos (uno por usuario). Usa el campo for_user_id para identificar la suscripción. Cuando hago una suscripción a mi webhook, ¿puedo reemplazar la /all/ parte del endpoint con otros objetos de datos de actividad de cuenta para limitar las actividades entregadas? No. El producto /all/ es la única opción y entrega todos los tipos de eventos compatibles. Si tengo acceso a tres webhooks, ¿puedo usar tres webhooks para cada una de las apps que he registrado para uso Enterprise? El límite de webhooks se establece a nivel de cuenta, no por App. Por ejemplo, con tres webhooks y dos Apps, podrías usar dos webhooks para una App y uno para la otra, pero no tres por App.

Índice de referencia de Account Activity API

PropósitoEndpoint v2
Suscribe una App a los eventos de una cuentaPOST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Devuelve el recuento de suscripciones activas actualmenteGET /2/account_activity/subscriptions/count
Comprueba si un webhook está suscrito a una cuentaGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Devuelve una lista de las suscripciones activas actualmenteGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Desactiva una suscripción usando OAuth solo de la AppDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Crea un trabajo de reproducciónPOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Para los endpoints de administración de webhooks (registrar, ver, validar, DELETE), consulta la documentación de la Webhooks API v2
I