Vai al contenuto principale

Account Activity API v2

L’Account Activity API v2 è ora disponibile su Pro!

Panoramica

L’Account Activity API (AAA) consente di ricevere in tempo reale eventi relativi agli account utente di X tramite webhook. Sottoscrivendo specifici account utente a un webhook preconfigurato, la tua applicazione può essere notificata di varie attività come Post, Messaggi Diretti, like, follow, blocchi e altro, da uno o più dei tuoi account di proprietà o sottoscritti tramite un’unica connessione.
Questa API è comunemente utilizzata per sviluppare applicazioni che devono reagire istantaneamente alle azioni degli utenti o mantenere uno stato aggiornato in base all’attività dell’utente. Riceverai tutte le attività pertinenti elencate di seguito per ciascuna sottoscrizione utente associata alla registrazione del tuo webhook:

Tipi di attività

  • Post (dell’utente)
  • Eliminazioni di Post (dell’utente)
  • @menzioni (dell’utente)
  • Risposte (all’utente o dall’utente)
  • Repost (dell’utente o relativi all’utente)
  • Post citati (dell’utente o relativi all’utente)
  • Repost di Post citati (dell’utente o relativi all’utente)
  • Like (dell’utente o relativi all’utente)
  • Follow (dell’utente o relativi all’utente)
  • Unfollow (dell’utente o relativi all’utente)
  • Blocchi (dell’utente o relativi all’utente)
  • Sblocchi (dell’utente o relativi all’utente)
  • Silenziamenti (dell’utente o relativi all’utente)
  • Riattivazioni (dell’utente o relative all’utente)
  • Messaggi Diretti inviati (dell’utente)
  • Messaggi Diretti ricevuti (dell’utente)
  • Indicatori di digitazione (verso l’utente)
  • Conferme di lettura (verso l’utente)
  • Revoche di sottoscrizione (dell’utente)
Nota: Non forniamo i dati della home timeline tramite l’Account Activity API. Usa l’endpoint User Posts timeline by User ID per recuperare questi dati.

Panoramica delle funzionalità

PianoPrezzoNumero di abbonamenti univociNumero di webhook
Pro$5.000/mese31
EnterpriseContatta il reparto vendite5000+5+
Questo documento è incentrato sulla gestione degli abbonamenti utente associati ai tuoi webhook utilizzando gli endpoint della Account Activity API v2.

Gestire le sottoscrizioni

L’Account Activity API invia messaggi JSON tramite webhook ogni volta che si verificano eventi associati agli account X sottoscritti al tuo servizio. X recapita queste attività al webhook che hai registrato. Nei passaggi seguenti imparerai a configurare e gestire le sottoscrizioni per gli account utente.

1. Crea una X App

Crea una X App con un account sviluppatore approvato dal developer portal. Se crei l’App per conto della tua azienda, utilizza un account X aziendale.
  • Abilita “Read, Write, and Access Direct Messages” nella scheda delle autorizzazioni della pagina della tua App.
  • Nella scheda “Keys and Access Tokens”, annota la Consumer Key (API Key), la Consumer Token (API Secret) e il Bearer Token della tua App.
  • Genera l’Access Token e l’Access Token Secret della tua App. Sono necessari per sottoscrivere gli account utente.
  • Consulta Obtaining Access Tokens se non conosci X Sign-in e i contesti utente.
  • Annota l’id numerico della tua App dalla pagina “Apps” nel developer portal. È richiesto quando si richiede l’accesso all’Account Activity API.

2. Ottenere l’accesso all’Account Activity API

L’Account Activity API è disponibile solo nel tier Enterprise. Invia una richiesta per l’accesso Enterprise tramite il developer portal.

3. Registra un webhook

Per ricevere gli eventi di Account Activity, devi registrare un webhook con un URL HTTPS pubblicamente accessibile. Consulta la documentazione della V2 Webhooks API per dettagli sullo sviluppo di un’app consumer del webhook, sulla registrazione del webhook, sulla sua protezione e sulla gestione dei Challenge-Response Checks (CRC).
  • Assicurati che il tuo webhook sia configurato per gestire richieste POST con payload di eventi in formato JSON.
  • Recupera il webhook_id dalla risposta alla registrazione del webhook, poiché è necessario per gestire le sottoscrizioni.

4. Convalida della configurazione

Per verificare che la tua App e il webhook siano configurati correttamente:
  • Iscrivi un account utente al tuo webhook (vedi “Adding a Subscription” di seguito).
  • Metti Mi piace a un Post pubblicato da uno degli account X a cui la tua App è iscritta.
  • Dovresti ricevere un payload favorite_events tramite una richiesta POST all’URL del tuo webhook.
  • Nota: potrebbero essere necessari fino a 10 secondi prima che gli eventi inizino a essere recapitati dopo l’aggiunta di una sottoscrizione.

Note importanti

  • Autenticazione: Quando sottoscrivi gli utenti, utilizza la consumer key, la consumer secret, l’access token e l’access token secret dell’account dell’utente.
  • Messaggi Diretti: Tutti i Messaggi Diretti in entrata e in uscita (inviati tramite POST /2/dm_conversations/with/:participant_id/messages) vengono recapitati tramite webhook per mantenere la tua App informata su tutta l’attività dei DM.
  • Duplicazione degli eventi:
    • Se due utenti sottoscritti partecipano alla stessa conversazione DM, il tuo webhook riceve eventi duplicati (uno per utente). Usa il campo for_user_id per distinguerli.
    • Se più App condividono la stessa URL del webhook e lo stesso utente, gli eventi vengono inviati più volte (una per App).
    • La tua App dovrebbe deduplicare gli eventi utilizzando l’id dell’evento per gestire duplicati occasionali.
  • Codice di esempio: Consulta Account Activity API Setup per un’applicazione web che visualizza gli eventi del webhook.

Gestione degli utenti iscritti (API v2)

Una volta registrato un webhook con un webhook_id valido, puoi gestire le iscrizioni degli utenti per ricevere le attività dei loro account. Usa i seguenti endpoint per aggiungere, visualizzare o rimuovere le iscrizioni. Endpoint: POST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Abbona l’utente autenticato a ricevere eventi tramite il webhook specificato.
Authentication: OAuthUser (flusso OAuth a 3 vie richiesto, rappresenta l’utente che viene abbonato).
  • Consumer Key: es., xvz1evFS…
  • Access Token: es., 370773112-GmHxMAgYyLbN…
Path Parameters:
ParameterDescription
webhook_idL’id del webhook con cui associare l’abbonamento.
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"'
Risposte:
  • Esito positivo (200 OK):
  • JSON
{
  "data": {
    "subscribed": true
  }
}
  • Errore (400 Bad Request):
MotivoDescrizione
WebhookIdInvalidIl webhook&#95;id fornito non è stato trovato o non è associato all’App.
DuplicateSubscriptionFailedEsiste già un’iscrizione per questo utente per il webhook&#95;id specificato.
SubscriptionLimitExceededL’applicazione ha raggiunto il limite di iscrizioni su tutti i webhook.

Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Description: Verifica se l’utente autenticato è sottoscritto al webhook specificato.
Authentication: OAuthUser (flusso OAuth a 3 vie richiesto).
Path Parameters:
ParameterDescription
webhook_idL’id del webhook da verificare.
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="GENERATO", oauth_signature="GENERATA", oauth_signature_method="HMAC-SHA1", oauth_timestamp="GENERATO", oauth_token="<ACCESS_TOKEN>", oauth_version="1.0"'
Risposte:
  • Esito positivo (200 OK):
  • JSON
{
  "data": {
    "subscribed": true // o false
  }
}
  • Errore (400 Bad Request):
MotivoDescrizione
WebhookIdInvalidIl webhook_id fornito non è stato trovato o non è associato all’App.

Endpoint: DELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Description: Disattiva la sottoscrizione per un determinato user ID, interrompendo la consegna degli eventi al webhook.
Authentication: OAuth2 App only Bearer Token.
  • Bearer Token: ad es. AAAAAAAAAAAA0%2EUifi76ZC9Ub0wn…
Path Parameters:
ParameterDescription
webhook_idL’id del webhook che contiene la sottoscrizione.
user_idL’id numerico dell’utente da rimuovere dalla sottoscrizione.
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>'
Risposte:
  • Esito positivo (200 OK):
  • JSON
{
  "data": {
    "subscribed": false
  }
}
  • Errore (400 Bad Request):
MotivoDescrizione
SubscriptionNotFoundNon esiste alcuna sottoscrizione per lo user_id specificato sul webhook_id indicato.
WebhookIdInvalidIl webhook_id fornito non è stato trovato o non è associato all’App.
Endpoint: GET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Description: Recupera l’elenco di tutti gli id utente attualmente sottoscritti al webhook specificato.
Authentication: OAuth2 App only Bearer Token.
Path Parameters:
ParameterDescription
webhook_idL’id del webhook per cui elencare le sottoscrizioni.
Request:
bash
curl --request GET --url 'https://api.twitter.com/2/account_activity/webhooks/:WEBHOOK_ID/subscriptions/all/list' \
--header 'authorization: Bearer <BEARER_TOKEN>'
Risposte:
  • Esito positivo (200 OK):
  • JSON
{
  "data": {
    "application_id": "<id della tua App>",
    "webhook_id": "<id del webhook>",
    "webhook_url": "<URL di callback del webhook>",
    "subscriptions": [
      { "user_id": "<id_utente_1>" },
      { "user_id": "<id_utente_2>" }
    ]
  }
}
  • Errore (400 Bad Request):
MotivoDescrizione
WebhookIdInvalidIl webhook_id fornito non è stato trovato o non è associato all’App.

Endpoint: GET /2/account_activity/subscriptions/count
Description: Restituisce il numero totale di sottoscrizioni attive e il limite di provisioning per l’applicazione autenticata.
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>'
Risposte:
  • Esito positivo (200 OK):
  • JSON
{
  "data": {
    "account_name": "<nome della tua App>",
    "provisioned_count": "<limite di abbonamenti assegnato>",
    "subscriptions_count_all": "<numero attuale di abbonamenti attivi>",
    "subscriptions_count_direct_messages": "0" // Gli abbonamenti limitati ai DM non sono più supportati
  }
}
AAAv2 offre funzionalità di replay che consentono di recuperare eventi passati per un intervallo di tempo specificato e di riconsegnarli al webhook. Questo è utile per recuperare eventi persi a causa di periodi di inattività. Endpoint: POST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all Description: Avvia un job di replay Authentication: OAuth2 App only Bearer Token Path Parameters:
ParameterDescription
webhook_idL’id del webhook da avviare per il replay
Query Parameters:
ParameterDescription
from_dateIl timestamp UTC più vecchio (iniziale) da cui verranno forniti gli eventi; deve essere nel formato ‘yyyymmddhhmm’. Il timestamp ha granularità al minuto ed è inclusivo (ad es. 12:00 include il minuto 00). Gli orari validi devono rientrare nelle ultime 24 ore (UTC) e non essere più recenti di 31 minuti rispetto al momento attuale. Si consiglia che from_date e to_date siano entro ~2 ore.
to_dateIl timestamp UTC più recente (finale) fino al quale verranno forniti gli eventi; deve essere nel formato ‘yyyymmddhhmm’. Il timestamp ha granularità al minuto ed è esclusivo (ad es. 12:30 non include il trentesimo minuto dell’ora). Gli orari validi devono rientrare nelle ultime 24 ore (UTC) e non essere più recenti di 10 minuti rispetto al momento attuale.
Responses: Success:
200

{
  "for_user_id": "<USER_ID>",
  "replay_event": {
    "job_id": "<REPLAY_JOB_ID>",
    "created_at": "yyyy-mm-ddThh:mm:ss.000Z"
  }
}
Errori:
MotivoDescrizione
QueryParamInvalidfrom_date è antecedente di oltre 24 ore rispetto all’ora corrente.
QueryParamInvalidfrom_date è successivo a to_date.
QueryParamInvalidfrom_date è nel futuro.
QueryParamInvalidto_date è nel futuro.
QueryParamInvalidfrom_date o to_date non è nel formato corretto.
CrcValidationFailedRisposta non corretta ricevuta dall’URL del webhook durante la convalida CRC.
ReplayConflictErrorUn processo di replay è già in corso per il webhook specificato.
WebhookIdInvalidIl webhook_id fornito non è valido o non è associato all’App.

Messaggi di completamento del job

Al termine dell’esecuzione del job di replay, X invierà il seguente evento di completamento. Una volta ricevuto questo evento, il job è concluso e se ne può inviare un altro.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Completato",
    "job_state_description": "Processo completato con successo"
    "job_id": "<JOB_ID>"
  }
}
Nel caso in cui il tuo job non venga completato correttamente, restituiremo il seguente messaggio invitandoti a ritentare il Replay Job. Una volta ricevuto questo evento, il job ha terminato l’esecuzione e se ne può inviare un altro.
{
  "replay_job_status": {
    "webhook_id": "<WEBHOOK_ID>",
    "job_state": "Incompleto",
    "job_state_description": "Il job non è riuscito a recapitare tutti gli eventi; riprova a eseguire il job di replay"
    "job_id": "<JOB_ID>"
  }
}

Struttura dell’oggetto dei dati dell’attività dell’account

OggettoDettagli
for_user_idIdentifica l’abbonamento dell’utente a cui l’evento è correlato.
is_blocked_by(Condizionale) Mostrato solo per gli eventi di menzione di Post se l’utente che menziona è bloccato dall’utente iscritto.
sourceL’utente che esegue l’attività (ad es. l’utente che segue, blocca o silenzia).
targetL’utente a cui si applica l’attività (ad es. l’utente seguito, bloccato o silenziato).

Attività disponibili

Tipo di messaggioDettagli
tweet_create_eventsStato del Post per Post, Retweet, risposte, @menzioni, Quote Tweet o Retweet di Quote Tweet.
favorite_eventsEvento di like con utente e destinatario.
follow_eventsEvento di follow con utente e destinatario.
unfollow_eventsEvento di unfollow con utente e destinatario.
block_eventsEvento di blocco con utente e destinatario.
unblock_eventsEvento di sblocco con utente e destinatario.
mute_eventsEvento di silenziamento con utente e destinatario.
unmute_eventsEvento di riattivazione con utente e destinatario.
user_eventEvento di revoca quando un utente rimuove l’autorizzazione dell’App (abbonamento eliminato automaticamente).
direct_message_eventsStato dei DM per messaggi inviati o ricevuti.
direct_message_indicate_typing_eventsEvento di digitazione DM con utente e destinatario.
direct_message_mark_read_eventsEvento di lettura DM con utente e destinatario.
tweet_delete_eventsNotifica di Post eliminati per conformità.
spaces_eventsAttualmente non supportato. In arrivo.

Esempi di payload

Di seguito sono riportati esempi di payload per ogni evento di Account Activity.

tweet_create_events (Post, Retweet, risposte, QuoteTweets)

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

tweet_create_events (@menzioni)

{
  "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": {
      <Oggetto utente>
    }
  }]
}

eventi_segui

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

eventi_unfollow

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

block_events

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

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": {
        <Oggetto utente>
      },
      "target": {
        <Oggetto utente>
      }
    }
  ]
}

eventi_riattiva_audio

{
  "for_user_id": "2244994945",
  "mute_events": [
    {
      "type": "riattivazione dell'audio",
      "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": "Ciao mondo!",
        "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 opinioni personali"
      "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"
    }
  }
}

eventi_indicazione_digitazione_messaggi_diretti

{
  "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 opinioni personali"
      "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": "dati di giorno su X, design al tramonto",
      "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 le opinioni sono personali"
      "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"
    }
  ]
}

Supporto per i Post longform

La Account Activity API v2 ora supporta i post longform, ovvero i post che superano i 280 caratteri. Quando un post longform è incluso in un payload tweet_create_events, il campo text contiene i primi 140 caratteri (o meno) e il campo truncated è impostato su true. Il contenuto completo del post è fornito nell’oggetto extended_tweet, che include:
  • full_text: Il testo completo del post, inclusi tutti i caratteri oltre il limite di 280.
  • entities: Eventuali entità (ad es. hashtag, URL, menzioni utente, simboli) presenti nel testo completo, incluse quelle dopo il 280º carattere.
  • display_text_range: L’intervallo di caratteri da visualizzare, calcolato sul testo completo.
Questo garantisce che le applicazioni possano elaborare l’intero contenuto dei post longform, incluse menzioni e altre entità che compaiono più avanti nel testo. Di seguito è riportato un esempio di payload tweet_create_events per un 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": "Il Meccanismo di Anticitera: una finestra sull’ingegno dell’antichità. Scoperto nel 1901 tra i resti di una nave romana di… https://t.co/bzbEKj8cd8",
      "display_text_range": [
        0,
        140
      ],
      ...
      "user": {
        ...
      },
      ...
      "extended_tweet": {
        "full_text": "Il Meccanismo di Anticitera: una finestra sull’ingegno dell’antichità. Scoperto nel 1901 tra i relitti di una nave romana al largo dell’isola greca di Anticitera, il Meccanismo di Anticitera è spesso considerato il primo computer analogico al mondo. Questo intricato dispositivo in bronzo, risalente a circa il 100 a.C., ha affascinato storici, archeologi e scienziati per il suo design sofisticato e il suo scopo misterioso. Il meccanismo è costituito da un complesso sistema di ingranaggi, meticolosamente realizzati per eseguire calcoli straordinariamente avanzati per l’epoca. La sua scoperta ha messo in discussione convinzioni radicate sulle capacità tecnologiche del mondo antico. La funzione principale del Meccanismo di Anticitera sembra essere stata astronomica. Poteva prevedere le posizioni del Sole, della Luna e forse dei pianeti, tracciare le eclissi lunari e solari e persino calcolare le date dei Giochi olimpici. Le sue scale e i suoi indicatori, insieme a iscrizioni in greco antico, suggeriscono che fosse uno strumento sia per l’indagine scientifica sia per eventi culturali. Il suo livello di precisione, paragonabile a quello dell’orologeria del XIX secolo, sottolinea la notevole ingegnosità dei suoi creatori, probabilmente del mondo ellenistico. Nonostante decenni di studi, molte domande rimangono. Chi lo costruì e per chi? Fu un capolavoro unico o parte di una tradizione più ampia di dispositivi meccanici perduta nella storia? Le immagini a raggi X e le moderne tecniche computazionali hanno rivelato molto del suo funzionamento interno, eppure la piena portata delle sue capacità è ancora oggetto di dibattito. Alcuni propongono che fosse usato per previsioni astrologiche, mentre altri lo considerano uno strumento didattico per astronomi. Il Meccanismo di Anticitera rimane una testimonianza della curiosità e dell’innovazione umane, fungendo da ponte tra il mondo antico e quello moderno. Ci ricorda che, anche nell’antichità, si cercava di comprendere il cosmo con strumenti che rivaleggiano per complessità con la tecnologia odierna. Il suo duraturo mistero continua a ispirare stupore e ricerca, rendendolo uno degli artefatti più straordinari mai portati alla luce.\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: migrazione da Legacy Enterprise a v2

Consulta la nostra guida alla migrazione!

Domande frequenti

Quali sono i vantaggi dell’utilizzo della Account Activity API? La Account Activity API utilizza i webhook, fornendo dati in tempo reale senza richiedere una connessione aperta (a differenza delle API di streaming) o un polling frequente (a differenza delle API REST). I vantaggi includono:
  • Velocità: Fornisce i dati alla velocità di X.
  • Semplicità: Fornisce tutti gli eventi dell’account tramite un’unica connessione webhook, inclusi Post, @menzioni, risposte, Repost, Quote Tweets, like, DM, follow, blocchi e disattivazioni.
  • Scalabilità: Supporta tutte le attività per gli account gestiti senza limiti di velocità o limiti di eventi (piano Enterprise).
Ho bisogno di ambienti di sviluppo, staging e produzione per la Account Activity API, è possibile? Sì! Puoi registrare più URL di webhook e gestire separatamente le sottoscrizioni tramite la V2 Webhooks API. Avete guide passo‑passo su come configurare la Account Activity API? Sì! Consulta la Guida introduttiva ai webhook e l’applicazione di esempio Account Activity API. Quale autenticazione devo utilizzare con la Account Activity API? I requisiti di autenticazione sono specificati per endpoint. Consulta la sezione Authentication per i dettagli. Riceverò attività duplicate se sono iscritto a utenti che interagiscono tra loro? Sì. Se la tua App ha sottoscrizioni per l’Utente A e l’Utente B, e l’Utente A menziona l’Utente B in un Post, il tuo webhook riceve due eventi (uno per utente). Usa il campo for_user_id per identificare la sottoscrizione. Quando effettuo una sottoscrizione al mio webhook, posso sostituire la /all/ porzione dell’endpoint con altri oggetti di dati di attività dell’account per limitare le attività consegnate? No. Il prodotto /all/ è l’unica opzione e consegna tutti i tipi di evento supportati. Se ho accesso a tre webhook, posso usare tre webhook per ciascuna delle app che ho registrato per uso Enterprise? Il limite di webhook è impostato a livello di account, non per App. Ad esempio, con tre webhook e due App, potresti usare due webhook per un’App e uno per l’altra, ma non tre per App.

Indice di riferimento di Account Activity API

ScopoEndpoint v2
Iscrive un’App agli eventi di un accountPOST /2/account_activity/webhooks/:webhook_id/subscriptions/all
Restituisce il numero delle sottoscrizioni attualmente attiveGET /2/account_activity/subscriptions/count
Verifica se un webhook è iscritto a un accountGET /2/account_activity/webhooks/:webhook_id/subscriptions/all
Restituisce l’elenco delle sottoscrizioni attualmente attiveGET /2/account_activity/webhooks/:webhook_id/subscriptions/all/list
Disattiva una sottoscrizione utilizzando OAuth dell’appDELETE /2/account_activity/webhooks/:webhook_id/subscriptions/:user_id/all
Crea un job di replayPOST /2/account_activity/replay/webhooks/:webhook_id/subscriptions/all
Per gli endpoint di gestione dei webhook (registrazione, visualizzazione, convalida, delete), consulta la documentazione della Webhooks API v2
I