Pular para o conteúdo principal

Account Activity API v2

A Account Activity API v2 agora está disponível no Pro!

Visão geral

A Account Activity API (AAA) oferece uma maneira de receber eventos em tempo real relacionados a contas de usuário do X via webhooks. Ao inscrever contas de usuário específicas em um webhook predefinido, seu App pode ser notificado sobre várias atividades, como Posts, Mensagens diretas, likes, follows, blocks e mais, de uma ou mais de suas contas próprias ou assinadas, por meio de uma única conexão.
Essa API é comumente usada para criar aplicativos que precisam reagir instantaneamente às ações do usuário ou manter um estado atualizado com base na atividade do usuário. Você receberá todas as atividades relacionadas abaixo para cada assinatura de usuário no seu registro de webhook:

Tipos de atividade

  • Posts (pelo usuário)
  • Exclusões de Post (pelo usuário)
  • @menções (do usuário)
  • Respostas (para ou do usuário)
  • Reposts (pelo usuário ou do usuário)
  • Posts com citação (pelo usuário ou do usuário)
  • Reposts de Posts com citação (pelo usuário ou do usuário)
  • Likes (pelo usuário ou do usuário)
  • Seguir (pelo usuário ou do usuário)
  • Deixar de seguir (pelo usuário ou do usuário)
  • Bloqueios (pelo usuário ou do usuário)
  • Desbloqueios (pelo usuário ou do usuário)
  • Silenciamentos (pelo usuário ou do usuário)
  • Dessilenciamentos (pelo usuário ou do usuário)
  • Mensagens diretas enviadas (pelo usuário)
  • Mensagens diretas recebidas (pelo usuário)
  • Indicadores de digitação (para o usuário)
  • Confirmações de leitura (para o usuário)
  • Revogações de assinatura (pelo usuário)
Observação: Não entregamos dados da linha do tempo inicial via a Account Activity API. Use o endpoint User Posts timeline by User ID para obter esses dados.

Resumo de recursos

NívelPreçoNúmero de assinaturas exclusivasNúmero de webhooks
ProUS$ 5.000/mês31
EnterpriseFale com vendas5000+5+
Este documento trata do gerenciamento de assinaturas de usuários associadas aos seus webhooks usando os endpoints da Account Activity API v2.

Gerenciar assinaturas

A Account Activity API fornece mensagens JSON via webhook sempre que houver eventos associados a contas do X que estejam assinadas ao seu serviço. O X entrega essas atividades ao seu webhook registrado. Nas etapas a seguir, você aprenderá como configurar e gerenciar assinaturas para contas de usuário.

1. Crie um X App

Crie um X App com uma conta de desenvolvedor aprovada no portal do desenvolvedor. Se estiver criando o App em nome da sua empresa, use uma conta corporativa do X.
  • Ative “Read, Write, and Access direct messages” na guia de permissões da página do seu App.
  • Na guia “Keys and Access Tokens”, anote o Consumer Key (API Key), Consumer Token (API Secret) e o Bearer Token do seu App.
  • Gere o Access Token e o Access Token Secret do seu App. Eles são necessários para assinar contas de usuário.
  • Consulte Obtaining Access Tokens se não estiver familiarizado com X Sign-in e contextos de usuário.
  • Anote o id numérico do seu App na página “Apps” no portal do desenvolvedor. Isso é necessário ao solicitar acesso à Account Activity API.

2. Obter acesso à Account Activity API

A Account Activity API está disponível apenas no plano Enterprise. Envie uma solicitação de acesso ao Enterprise pelo portal do desenvolvedor.

3. Registrar um webhook

Para receber eventos de Account Activity, você deve registrar um webhook com uma URL HTTPS acessível publicamente. Consulte a documentação da V2 Webhooks API para obter detalhes sobre como desenvolver um App consumidor de webhook, registrar um webhook, protegê-lo e lidar com Challenge-Response Checks (CRC).
  • Certifique-se de que seu webhook esteja configurado para lidar com solicitações POST com payloads de eventos codificados em JSON.
  • Obtenha o webhook_id da resposta de registro do webhook, pois ele é necessário para gerenciar assinaturas.

4. Validar a configuração

Para verificar se sua App e o webhook estão configurados corretamente:
  • Inscreva uma conta de usuário no seu webhook (consulte “Adicionar uma inscrição” abaixo).
  • Marque como favorito um Post publicado por uma das contas da X às quais sua App está inscrita.
  • Você deverá receber um payload de favorite_events por meio de uma requisição POST para a URL do seu webhook.
  • Observação: Pode levar até 10 segundos para que os eventos comecem a ser entregues após adicionar uma inscrição.

Notas importantes

  • Autenticação: Ao inscrever usuários, use a consumer key, consumer secret, access token e access token secret da conta do usuário.
  • Mensagens diretas: Todas as Mensagens diretas recebidas e enviadas (enviadas via POST /2/dm_conversations/with/:participant_id/messages) são entregues via webhooks para manter seu App ciente de toda a atividade de DM.
  • Duplicação de eventos:
    • Se dois usuários inscritos estiverem na mesma conversa de DM, seu webhook receberá eventos duplicados (um por usuário). Use o campo for_user_id para diferenciá-los.
    • Se vários Apps compartilharem a mesma URL de webhook e o mesmo usuário, os eventos serão enviados várias vezes (uma por App).
    • Seu App deve desduplicar eventos usando o event ID para lidar com duplicatas ocasionais.
  • Exemplo de código: Consulte o Account Activity API Setup para um aplicativo web que exibe eventos de webhook.

Gerenciando usuários inscritos (API v2)

Depois de registrar um webhook com um webhook_id válido, você pode gerenciar as assinaturas de usuários para receber as atividades das contas deles. Use os seguintes endpoints para adicionar, visualizar ou remover assinaturas. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Inscreve o usuário autenticado para receber eventos por meio do webhook especificado.
Authentication: OAuthUser (fluxo OAuth de 3 etapas necessário, representando o usuário sendo inscrito).
  • Consumer Key: por exemplo, xvz1evFS…
  • Access Token: por exemplo, 370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_idO id do webhook ao qual a assinatura será associada.
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="GERADO", oauth_signature="GERADO", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GERADO", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Respostas:
  • Sucesso (200 OK):
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • Falha (400 Bad Request):
MotivoDescrição
WebhookIdInvalidO webhook_id fornecido não foi encontrado ou não está associado à App.
DuplicateSubscriptionFailedJá existe uma assinatura para este usuário para o webhook_id especificado.
SubscriptionLimitExceededO aplicativo atingiu o limite de assinaturas em todos os webhooks.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Verifica se o usuário autenticado está com assinatura no webhook especificado.
Authentication: OAuthUser (fluxo OAuth de 3 etapas necessário).
Path Parameters:
ParameterDescription
webhook_idO id do webhook a ser verificado.
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="GERADO", oauth_signature="GERADO", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GERADO", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Respostas:
  • Sucesso (200 OK):
  • JSON
{
  "data": {
    "subscribed": true // ou false
  }
}
  • Falha (400 Bad Request):
MotivoDescrição
WebhookIdInvalidO webhook_id fornecido não foi encontrado ou não está associado à App.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: Desativa a assinatura de um usuário específico, interrompendo a entrega de eventos ao webhook.
Authentication: OAuth2 App only Bearer Token.
  • Bearer Token: por exemplo, AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Path Parameters:
ParameterDescription
webhook_idO id do webhook que contém a assinatura.
user_idO id numérico do usuário a ser removido da assinatura.
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>'
Respostas:
  • Êxito (200 OK):
  • json
{
  "data": {
    "subscribed": false
  }
}
  • Falha (400 Bad Request):
MotivoDescrição
SubscriptionNotFoundNão há assinatura para o user_id especificado no webhook_id fornecido.
WebhookIdInvalidO webhook_id fornecido não foi encontrado ou não está associado à App.
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: Retorna uma lista de todos os IDs de usuários atualmente inscritos no webhook especificado.
Authentication: OAuth2 App only Bearer Token.
Path Parameters:
ParameterDescription
webhook_idO id do webhook para o qual listar as assinaturas.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Respostas:
  • Sucesso (200 OK):
  • JSON
{
  "data": {
    "application_id": "<id do seu App>",
    "webhook_id": "<id do webhook>",
    "webhook_url": "<URL de callback do webhook>",
    "subscriptions": [
      { "user_id": "<id_do_usuario_1>" },
      { "user_id": "<id_do_usuario_2>" }
    ]
  }
}
  • Falha (400 Bad Request):
MotivoDescrição
WebhookIdInvalidO webhook_id fornecido não foi encontrado ou não está associado à App.

Endpoint: GET /2/account_activity/subscriptions/count
Descrição: Retorna a contagem total de assinaturas ativas e o limite provisionado para a App autenticadora.
Autenticação: OAuth2 App only Bearer Token.
Requisição:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/subscriptions/count' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Respostas:
  • Sucesso (200 OK):
  • JSON
{
  "data": {
    "account_name": "<nome da sua App>",
    "provisioned_count": "<limite de assinaturas provisionado>",
    "subscriptions_count_all": "<número atual de assinaturas ativas>",
    "subscriptions_count_direct_messages": "0" // Assinaturas somente de DM não são mais compatíveis
  }
}
AAAv2 fornece a funcionalidade de replay que permite recuperar eventos passados em um intervalo de tempo especificado e reenviá-los ao seu webhook. Isso é útil para recuperar eventos perdidos devido a indisponibilidade. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Description: Inicia um job de replay Authentication: OAuth2 App Only Bearer Token Path Parameters:
ParameterDescription
webhook_idO id do webhook para iniciar o replay
Query Parameters:
ParameterDescription
from_dateO timestamp UTC mais antigo (inicial) a partir do qual os eventos serão fornecidos; deve estar no formato ‘yyyymmddhhmm’. O timestamp tem granularidade de minuto e é inclusivo (ou seja, 12:00 inclui o minuto 00). Os horários válidos devem estar dentro das últimas 24 horas, em UTC, e não mais recentes do que 31 minutos antes do momento atual. Recomenda-se que from_date e to_date estejam dentro de ~2 horas.
to_dateO timestamp UTC mais recente (final) até o qual os eventos serão fornecidos; deve estar no formato ‘yyyymmddhhmm’. O timestamp tem granularidade de minuto e é exclusivo (ou seja, 12:30 não inclui o 30º minuto da hora). Os horários válidos devem estar dentro das últimas 24 horas, em UTC, e não mais do que 10 minutos antes do momento atual.
Responses: Success:
200

{
  "for_user_id": "<USER_ID>"
  "replay_event": {
    "job_id": "<REPLAY_JOB_ID>",
    "created_at": "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Falhas:
MotivoDescrição
QueryParamInvalidfrom_date é anterior a 24 horas em relação ao horário atual.
QueryParamInvalidfrom_date é mais recente que to_date.
QueryParamInvalidfrom_date está no futuro.
QueryParamInvalidto_date está no futuro.
QueryParamInvalidfrom_date ou to_date não está no formato correto.
CrcValidationFailedResposta incorreta recebida do URL do webhook durante a validação de CRC.
ReplayConflictErrorJá há um job de repetição em andamento para o webhook especificado.
WebhookIdInvalidO webhook_id fornecido é inválido ou não está associado à App.

Mensagens de conclusão de job

Quando seu job de replay for concluído com sucesso, a X enviará o seguinte evento de conclusão de job. Ao receber esse evento, o job terá finalizado sua execução e outro poderá ser enviado.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Complete",
    "job_state_description": "Job concluído com sucesso",
    "job_id": "<JOB_ID>"
  }
}
Caso seu job não seja concluído com êxito, retornaremos a seguinte mensagem recomendando que você tente executar novamente o Replay Job. Ao receber esse evento, o job terá sido finalizado e outro poderá ser enviado.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incompleto",
    "job_state_description": "Falha na entrega de todos os eventos; tente executar o seu replay job novamente",
    "job_id": "<JOB_ID>"
  }
}

Estrutura do objeto de dados de atividade da conta

ObjetoDetalhes
for_user_idIdentifica a assinatura de usuário à qual o evento está relacionado.
is_blocked_by(Condicional) Exibido apenas para eventos de menção a Post se o usuário que menciona estiver bloqueado pelo usuário inscrito.
sourceO usuário que realiza a atividade (por exemplo, o usuário que segue, bloqueia ou silencia).
targetO usuário ao qual a atividade se aplica (por exemplo, o usuário seguido, bloqueado ou silenciado).

Atividades disponíveis

Tipo de mensagemDetalhes
tweet_create_eventsStatus de Post para Posts, Retweets, respostas, @menções, Tweets com citação ou Retweet de Tweets com citação.
favorite_eventsEvento de like com usuário e destino.
follow_eventsEvento de seguir com usuário e destino.
unfollow_eventsEvento de deixar de seguir com usuário e destino.
block_eventsEvento de bloqueio com usuário e destino.
unblock_eventsEvento de desbloqueio com usuário e destino.
mute_eventsEvento de silenciamento com usuário e destino.
unmute_eventsEvento de reativação de som com usuário e destino.
user_eventEvento de revogação quando um usuário remove a autorização do App (assinatura excluída automaticamente).
direct_message_eventsStatus de DM para mensagens enviadas ou recebidas.
direct_message_indicate_typing_eventsEvento de digitação em DM com usuário e destino.
direct_message_mark_read_eventsEvento de leitura em DM com usuário e destino.
tweet_delete_eventsAviso de Posts excluídos para fins de conformidade.
spaces_eventsAtualmente não suportado. Em breve.

Exemplos de payload

A seguir estão exemplos de payload para cada evento de Account Activity.

tweet_create_events (Posts, Retweets, Respostas, QuoteTweets)

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

tweet_create_events (@menções)

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

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": {
      <Objeto de usuário>
    }
  }]
}

follow_events

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "follow",
    "created_timestamp": "1517588749178",
    "target": {
      <objeto de usuário>
    },
    "source": {
      <objeto de usuário>
    }
  }]
}

eventos_de_unfollow

{
  "for_user_id": "2244994945",
  "follow_events": [{
    "type": "unfollow",
    "created_timestamp": "1517588749178",
    "target": {
      <objeto de usuário>
    },
    "source": {
      <objeto de usuário>
    }
  }]
}

block_events

{
  "for_user_id": "2244994945",
  "block_events": [{
    "type": "block",
    "created_timestamp": "1518127020304",
    "source": {
      <objeto de usuário>
    },
    "target": {
      <objeto de usuário>
    }
  }]
}

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": {
        <objeto de usuário>
      },
      "target": {
        <objeto de usuário>
      }
    }
  ]
}

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": "Olá, 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 — opiniões pessoais sobre X",
      "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_indicacao_de_digitacao_de_mensagem_direta

{
  "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 — opiniões são minhas",
      "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"
    }
  }
}

eventos_de_mensagem_direta_marcadas_como_lidas

{
  "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": "dados de dia na @X, design ao entardecer",
      "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 — opiniões pessoais sobre X"
      "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"
    }
  ]
}

Suporte a Posts Longform

A Account Activity API v2 agora oferece suporte a posts longform, que são posts com mais de 280 caracteres. Quando um post longform é incluído em um payload de tweet_create_events, o campo text contém os primeiros 140 caracteres (ou menos), e o campo truncated é definido como true. O conteúdo completo do post é entregue no objeto extended_tweet, que inclui:
  • full_text: o texto completo do post, incluindo todos os caracteres além do limite de 280 caracteres.
  • entities: quaisquer entidades (por exemplo, hashtags, URLs, menções de usuários, símbolos) que apareçam no texto completo, incluindo aquelas após o 280º caractere.
  • display_text_range: a faixa de caracteres a exibir, considerando o texto completo.
Isso garante que os aplicativos possam processar todo o conteúdo de posts longform, incluindo menções ou outras entidades que apareçam mais adiante no texto. Abaixo está um exemplo de um payload de tweet_create_events para um post longform:
{
  "for_user_id": "1603419180975409153",
  "tweet_create_events": [
    {
      "created_at": "Mon May 19 14:01:46 +0000 2025",
      "id": 1924465506158879000,
      "id_str": "1924465506158878979",
      "text": "O Mecanismo de Anticítera: uma janela para a engenhosidade da Antiguidade Descoberto em 1901 entre os destroços de um navio romano de… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "O Mecanismo de Anticítera: uma janela para a engenhosidade da Antiguidade Descoberto em 1901 entre os destroços de um navio romano ao largo da ilha grega de Anticítera, o Mecanismo de Anticítera é frequentemente descrito como o primeiro computador analógico do mundo. Esse intricado dispositivo de bronze, datado de cerca de 100 a.C., cativou historiadores, arqueólogos e cientistas com seu design sofisticado e propósito misterioso. O mecanismo consiste em um sistema complexo de engrenagens, meticulosamente elaborado para realizar cálculos surpreendentemente avançados para sua época. Sua descoberta desafiou suposições de longa data sobre as capacidades tecnológicas do mundo antigo. A função principal do Mecanismo de Anticítera parece ter sido astronômica. Ele podia prever as posições do Sol, da Lua e possivelmente dos planetas, acompanhar eclipses lunares e solares e até calcular as datas dos Jogos Olímpicos. Os mostradores e ponteiros do dispositivo, juntamente com inscrições em grego antigo, sugerem que era uma ferramenta tanto para investigação científica quanto para eventos culturais. Seu nível de precisão, comparável ao da relojoaria do século XIX, ressalta a notável engenhosidade de seus criadores, provavelmente do mundo helenístico. Apesar de décadas de estudo, muitas perguntas permanecem. Quem o construiu e para quem? Foi uma obra-prima singular ou parte de uma tradição mais ampla de dispositivos mecânicos perdidos na história? Imagens de raio X e técnicas computacionais modernas revelaram muito sobre seu funcionamento interno, mas o escopo completo de suas capacidades ainda é debatido. Alguns propõem que ele era usado para previsões astrológicas, enquanto outros o veem como uma ferramenta didática para astrônomos. O Mecanismo de Anticítera permanece como um testemunho da curiosidade e da inovação humanas, ligando os mundos antigo e moderno. Ele nos lembra que, mesmo na Antiguidade, as pessoas buscavam compreender o cosmos com ferramentas que rivalizam em complexidade com a tecnologia atual. Seu mistério duradouro continua a inspirar admiração e investigação, tornando-o um dos artefatos mais notáveis já descobertos.\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": "x.com/i/web/status/1…",
            "indices": [
              117,
              140
            ]
          }
        ],
        "user_mentions": [],
        "symbols": []
      },
      ...
    }
  ]
}

Account Activity API Migração do Enterprise legado para a v2

Confira nosso guia de migração!

Perguntas frequentes

Quais são as vantagens de usar a Account Activity API? A Account Activity API usa webhooks, entregando dados em tempo real sem exigir uma conexão aberta (diferente das APIs de stream) ou polling frequente (diferente das APIs REST). Os benefícios incluem:
  • Velocidade: Entrega dados na velocidade do X.
  • Simplicidade: Fornece todos os eventos de conta por meio de uma única conexão de webhook, incluindo Posts, @menções, respostas, reposts, Quote Tweets, likes, DMs, follows, blocks e mutes.
  • Escala: Oferece suporte a todas as atividades para contas gerenciadas, sem limites de requisições ou tetos de eventos (camada Enterprise).
Preciso de ambientes de desenvolvimento, homologação e produção para a Account Activity API; isso é possível? Sim! Você pode registrar várias URLs de webhook e gerenciar assinaturas separadamente por meio da V2 Webhooks API. Vocês têm algum guia passo a passo sobre como começar a usar a Account Activity API? Sim! Consulte o guia Getting Started with Webhooks e o Account Activity API Sample Application. Qual autenticação devo usar com a Account Activity API? Os requisitos de autenticação são especificados por endpoint. Consulte a seção Authentication para obter detalhes. Vou receber atividades duplicadas se estiver inscrito em users que estão interagindo entre si? Sim. Se sua App tiver assinaturas para o Usuário A e o Usuário B, e o Usuário A mencionar o Usuário B em um Post, seu webhook receberá dois eventos (um por usuário). Use o campo for_user_id para identificar a assinatura. Quando faço uma assinatura para meu webhook, posso substituir a /all/ parte do endpoint por outros objetos de dados de atividade de conta para limitar as atividades entregues? Não. O produto /all/ é a única opção e entrega todos os tipos de eventos compatíveis. Se eu tiver acesso a três webhooks, posso usar três webhooks para cada uma das apps que registrei para uso enterprise? O limite de webhook é definido no nível da conta, não por App. Por exemplo, com três webhooks e duas Apps, você poderia usar dois webhooks para uma App e um para a outra, mas não três por App.

Índice de referência da Account Activity API

FinalidadeEndpoint v2
Inscreve um App nos eventos de uma contaPOST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Retorna a contagem das assinaturas ativas no momentoGET /2/account_activity/subscriptions/count
Verifica se um webhook está inscrito em uma contaGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Retorna a lista das assinaturas ativas no momentoGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Desativa uma assinatura usando OAuth somente do AppDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Cria um job de replayPOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Para endpoints de gerenciamento de webhook (registrar, visualizar, validar, excluir), consulte a documentação da Webhooks API v2
I