Saltar al contenido principal

API de actividad de cuentas v2

La API de actividad de cuentas v2 ya está disponible en Pro.

Descripción general

La Account Activity API (AAA) ofrece 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, Me gusta, seguimientos, bloqueos y más, 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 de inmediato 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 por 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 citados (del usuario o sobre el usuario)
  • Reposts de Posts citados (del usuario o sobre el usuario)
  • Me gusta (del usuario o sobre el usuario)
  • Seguimientos (del usuario o hacia el usuario)
  • Dejar de seguir (del usuario o hacia el usuario)
  • Bloqueos (del usuario o hacia el usuario)
  • Desbloqueos (del usuario o hacia el usuario)
  • Silenciamientos (del usuario o hacia el usuario)
  • Quitar silenciamiento (del usuario o hacia el usuario)
  • Mensajes Directos enviados (por el usuario)
  • Mensajes Directos recibidos (por el usuario)
  • Indicadores de escritura (hacia el usuario)
  • Confirmaciones de lectura (hacia el usuario)
  • Revocaciones de suscripción (por el usuario)
Nota: No entregamos datos del timeline de inicio mediante la Account Activity API. Usa el endpoint User Posts timeline por User ID para obtener estos datos.

Resumen de funcionalidades

NivelPrecioNúmero de suscripciones únicasNúmero de webhooks
Pro5000 $ / mes31
EmpresarialContactar al equipo de ventas5000+5+
Este documento se centra en la gestión de suscripciones de usuarios asociadas a tus webhooks mediante los endpoints de la API de actividad de cuentas v2.

Administrar suscripciones

La Account Activity API envía mensajes JSON basados en webhooks cada vez que se producen eventos asociados a cuentas de X suscritas a tu servicio. X entrega esas actividades a tu webhook registrado. En los siguientes pasos, aprenderás a configurar y administrar suscripciones para cuentas de usuario.
Actualmente, Account Activity API v2 no es compatible con User Auth 2.0. Estamos trabajando para resolverlo y actualizaremos nuestra documentación cuando se admita OAuth 2.0.

1. Crea una App de X

Crea una App de X con una cuenta de desarrollador aprobada desde el Portal de desarrolladores. Si creas la App en nombre de tu empresa, utiliza una cuenta corporativa de X.
  • Habilita “Lectura, escritura y acceso a mensajes directos” en la pestaña de permisos de la página de tu App.
  • En la pestaña “Keys and Access Tokens”, toma nota de los 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 se necesitan para suscribirte a cuentas de usuario.
  • Revisa Obtaining Access Tokens si no estás familiarizado con X Sign-in y los contextos de usuario.
  • Toma nota del id numérico de tu App en la página “Apps” del Portal de desarrolladores. Esto es necesario al solicitar acceso a la Account Activity API.

2. Obtén acceso a la API de Account Activity

La API de Account Activity está disponible únicamente en el plan Empresarial. Envía una solicitud para obtener acceso Empresarial a través del Portal de desarrolladores.

3. Registra un webhook

Para recibir eventos de Account Activity, debes registrar un webhook con una URL HTTPS accesible públicamente. Consulta la documentación de la V2 Webhooks API para obtener detalles sobre cómo desarrollar una App consumidora de webhooks, registrar un webhook, protegerlo y manejar los Challenge-Response Checks (CRC).
  • Asegúrate de que tu webhook esté configurado para aceptar solicitudes POST con cargas de eventos codificadas en JSON.
  • Obtén el webhook_id de la respuesta al registrar el webhook, ya que se requiere para gestionar suscripciones.

4. Validar la configuración

Para comprobar que tu App y el 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 después de 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 mediante 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 eventos usando el id del evento para manejar duplicados ocasionales.
  • Código de ejemplo: Consulta Account Activity API Setup para ver una aplicación 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 gestionar las suscripciones de usuarios para recibir la actividad de sus cuentas. Usa los siguientes endpoints para agregar, ver o eliminar suscripciones. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Descripción: Suscribe al usuario autenticado para recibir eventos a través del webhook especificado.
Autenticación: OAuthUser (se requiere flujo OAuth de 3 etapas, que representa al usuario que se suscribe).
  • Consumer Key: p. ej., xvz1evFS…
  • Access Token: p. ej., 370773112-GmHxMAgYyLbN…
Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook con el que asociar la suscripción.
Solicitud:
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 ha alcanzado su límite de suscripciones en todos los webhooks.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Comprueba si el usuario autenticado está suscrito al webhook especificado.
Authentication: OAuthUser (se requiere flujo OAuth de 3 patas).
Path Parameters:
ParameterDescription
webhook_idEl id del webhook que se desea comprobar.
Request:
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 a la App.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Descripción: Desactiva la suscripción para un id de usuario específico y detiene la entrega de eventos al webhook.
Autenticación: OAuth2 App Only Bearer Token.
  • Bearer Token: p. ej., AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook que contiene la suscripción.
user_idEl id numérico del usuario al que se dará de baja.
Solicitud:
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
  }
}
  • Error (400 Solicitud incorrecta):
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
Descripción: Recupera una lista de todos los id de usuario actualmente suscritos al webhook especificado.
Autenticación: Token Bearer de App OAuth2 Only.
Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook para el que se desea listar suscripciones.
Solicitud:
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": "<el id de tu app>",
    "webhook&#95;id": "<id del webhook>",
    "webhook_url": "<la url de callback del webhook>",
    "subscriptions": [
      { "user_id": "<id_de_usuario_1>" },
      { "user_id": "<id_de_usuario_2>" }
    ]
  }
}
  • Error (400 Solicitud incorrecta):
MotivoDescripción
WebhookIdInvalidEl webhook_id proporcionado no se encontró o no está asociado a la App.

Endpoint: GET /2/account_activity/subscriptions/count
Descripción: Devuelve el número total de suscripciones activas y el límite aprovisionado para la App que se autentica.
Autenticación: OAuth2 App Only Bearer Token.
Solicitud:
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 suscripciones asignado>",
    "subscriptions_count_all": "<cantidad de suscripciones activas actuales>",
    "subscriptions_count_direct_messages": "0" // Ya no se admiten las suscripciones exclusivas de MD
  }
}
AAAv2 proporciona una función de repetición que te permite recuperar eventos pasados para un intervalo de tiempo especificado y volver a entregarlos a tu webhook. Esto es útil para recuperar eventos perdidos por tiempo de inactividad. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Descripción: Inicia una tarea de repetición Autenticación: OAuth2 App Only Bearer Token Parámetros de ruta:
ParámetroDescripción
webhook_idEl id del webhook con el que iniciar la repetición
Parámetros de consulta:
ParámetroDescripción
from_dateLa marca de tiempo UTC más antigua (de inicio) a partir de la cual se proporcionarán los eventos; debe estar en formato ‘yyyymmddhhmm’. La marca de tiempo tiene granularidad de minutos y es inclusiva (p. ej., 12:00 incluye el minuto 00). Las horas válidas deben estar dentro de las últimas 24 horas (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 (de fin) hasta la cual se proporcionarán los eventos; debe estar en 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). Las horas válidas deben estar dentro de las últimas 24 horas (UTC) y no más de 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 con respecto a 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 tienen el formato correcto.
CrcValidationFailedSe recibió una respuesta incorrecta desde la URL del webhook durante la validación de CRC.
ReplayConflictErrorYa hay un trabajo de repetición en curso para el webhook especificado.
WebhookIdInvalidEl webhook_id proporcionado no es válido o no está asociado con la App.

Mensajes de trabajo completado

Cuando tu trabajo de reproducción se complete correctamente, X enviará el siguiente evento de finalización de trabajo. Una vez que recibas este evento, el trabajo habrá terminado de ejecutarse y podrás 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 tarea no se completa correctamente, te enviaremos el siguiente mensaje para invitarte a reintentar tu Replay Job. Una vez que recibas este evento, la tarea habrá terminado de ejecutarse y podrás enviar otra.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incomplete",
    "job_state_description": "El trabajo no pudo entregar todos los eventos; vuelve a intentar tu 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 con la que se relaciona el evento.
is_blocked_by(Condicional) Se muestra solo en 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 que sigue, bloquea o silencia).
targetEl usuario al que se aplica la actividad (p. ej., el que es seguido, bloqueado o silenciado).

Actividades disponibles

Tipo de mensajeDetalles
tweet_create_eventsEstado de Post para Posts, Retweets, respuestas, @menciones, Tweets citados o Retweets de Tweets citados.
favorite_eventsEvento de Me gusta con usuario y destino.
follow_eventsEvento de seguir con usuario y destino.
unfollow_eventsEvento de dejar de seguir con usuario y destino.
block_eventsEvento de bloqueo con usuario y destino.
unblock_eventsEvento de desbloqueo con usuario y destino.
mute_eventsEvento de silencio con usuario y destino.
unmute_eventsEvento de reactivar sonido con usuario y destino.
user_eventEventos de revocación cuando un usuario elimina la autorización de la App (suscripción eliminada automáticamente).
direct_message_eventsEstado de MD para mensajes enviados o recibidos.
direct_message_indicate_typing_eventsEvento de escritura en MD con usuario y destino.
direct_message_mark_read_eventsEvento de lectura en MD con usuario y destino.
tweet_delete_eventsAviso de Posts eliminados para fines de cumplimiento.
spaces_eventsActualmente no disponible. 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, Replies, Tweets citados)

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

tweet_create_events (@menciones)

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

favorite_events

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

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <User Object>
    },
    "source": {
      <User Object>
    }
  }]
}

eventos_dejar_de_seguir

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <User Object>
    },
    "source": {
      <User Object>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <User Object>
    },
    "target": {
      <User Object>
    }
  }]
}

unblock_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "unblock",
    "created_timestamp": "1518127020304",
    "source": {
      <User Object>
    },
    "target": {
      <User Object>
    }
  }]
}

mute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "mute",
      "created_timestamp": "1518127020304",
      "source": {
        <User Object>
      },
      "target": {
        <User Object>
      }
    }
  ]
}

unmute_events

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "unmute",
      "created_timestamp": "1518127020304",
      "source": {
        <User Object>
      },
      "target": {
        <User Object>
      }
    }
  ]
}

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

eventos_de_indicación_de_escritura_en_mensajes_directos

{
  "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 opinions-are-my-own",
      "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 API de Actividad de Cuenta V2 ahora admite Posts de formato largo, es decir, publicaciones que superan los 280 caracteres. Cuando un Post de formato largo se incluye en un payload 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 que exceden el límite de 280.
  • entities: Cualquier entidad (p. ej., hashtags, URL, menciones de usuarios, símbolos) que aparezca en el texto completo, incluidas las que estén 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 un payload 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 año 100 a.C., ha cautivado a historiadores, arqueólogos y científicos con su diseño sofisticado y su propósito misterioso. El mecanismo consiste en un complejo sistema de engranajes, meticulosamente elaborado para realizar cálculos que siguen siendo 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, pero 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 humanas, conectando los mundos antiguo y moderno. Nos recuerda que incluso en la antigüedad, las personas buscaban comprender 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": []
      },
      ...
    }
  ]
}

API de actividad de la cuenta: migración de Legacy Enterprise 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 y entrega datos en tiempo real sin requerir una conexión abierta (a diferencia de las API de streaming) ni sondeos frecuentes (a diferencia de las API REST). Los beneficios incluyen:
  • Velocidad: Entrega datos a la velocidad de X.
  • Simplicidad: Proporciona todos los eventos de la cuenta mediante una única conexión de webhook, incluidos Posts, menciones (@mentions), respuestas (Replies), Reposts, Tweets citados (Quote Tweets), Me gusta (Likes), MD (DMs), seguimientos (Follows), bloqueos (Blocks) y silenciamientos (Mutes).
  • Escala: Admite todas las actividades para cuentas gestionadas sin límites de velocidad ni topes de eventos (nivel Empresarial).
Necesito entornos de desarrollo, staging y producción para la Account Activity API, ¿es posible? ¡Sí! Puedes registrar varias URL de webhook y gestionar las suscripciones por separado mediante la V2 Webhooks API. ¿Tienen guías 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 la 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 admitidos. Si tengo acceso a tres webhooks, ¿puedo usar tres webhooks para cada una de las apps que he registrado para uso empresarial? 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 la API de actividad de la cuenta

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 activasGET /2/account_activity/subscriptions/count
Comprueba si un webhook está suscrito a una cuentaGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Devuelve la lista de suscripciones activasGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Desactiva una suscripción con OAuth solo para la AppDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Crea un trabajo de repeticiónPOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Para los endpoints de gestión de webhooks (registrar, ver, validar, eliminar), consulta la documentación de la API de Webhooks V2