How to analyze edited Tweets with the Twitter API v2 using Python
Tags: twitter, python
Published: 2022-10-04 17:32:28

As announced [in this blog post](https://developer.twitter.com/en/blog/product-news/2022/supporting-edit-tweet-functionality), the Twitter API v2 supports the ability to get metadata about [edited Tweets](https://developer.twitter.com/en/docs/twitter-api/edit-tweets). In this short guide, I will showcase how developers and researchers can get information about edited Tweets from the Twitter API v2 in Python using [Tweepy](https://www.tweepy.org/).

## Prerequisite

In order to use the Twitter API v2, you need to [apply for a Twitter developer account](https://t.co/signup). Once you have an approved Twitter developer account, follow the instruction [here](https://github.com/twitterdev/getting-started-with-the-twitter-api-v2-for-academic-research/blob/main/modules/4-getting-your-keys-and-token.md#getting-keys-for-the-standard-product-track) to obtain your `BEARER TOKEN` that you will use to connect to the Twitter API v2 in you code in Python. We will be using the [Tweepy](https://github.com/tweepy/tweepy) package in Python to get Tweets from the Twitter API v2, so you will need to have Python as well as the Tweepy package installed on your machine. Instructions on installing the Tweepy package can be found in [this tutorial](https://dev.to/twitterdev/a-comprehensive-guide-for-using-the-twitter-api-v2-using-tweepy-in-python-15d9).

## Some fundamental background on Edit Tweets

Currently, some Tweets on [Twitter Blue](https://twitter.com/TwitterBlue) are editable. These Tweets are **editable for 30 minutes** and **up to 5 times**. Each time a Tweet is edited, a new Tweet ID is created for the edited Tweet.

There are three components to a Tweet’s edit history:

1. By default, the Tweet response from the Twitter API v2 will contain an array of Tweet IDs that are part of a Tweet’s edit history. This information is specified by the `edit_history_tweet_ids`, which is a default field in the Tweet response. This array will contain at least one ID, the ID of the original, unedited Tweet. **When there is only one ID that means the Tweet has no edit history**.

2. You can get information such as whether a Tweet was editable at the time it was created, how much time (if any) is remaining for a Tweet to be edited, and how many edits remain. This information is specified by requesting the `edit_controls` field in the `tweet.fields`.

    ```json
    {
    "edits_remaining": "5",
    "is_edit_eligible": true,
    "editable_until": "2022-09-30T18:30:01.000Z"
    }
    ```
    
3. Finally, you can get the Tweet objects for each Tweet in a Tweet’s edit history, by specifying the `edit_history_tweet_ids` using the expansion parameter

Also, while most Tweets are eligible for edit, Tweets such as those with polls, nullcast, promoted etc. are not eligible for edit. The `is_edit_eligible` field in `edit_controls` will indicate this. Full list of editable Tweet categories can be found [here](https://developer.twitter.com/en/docs/twitter-api/edit-tweets).

## Getting Edit Tweets metadata with Tweepy in Python

In the example below, the Tweet with ID `1575590109000323073` is a Tweet that has been edited. By default, the `edit_history_tweet_ids` will be returned containing a list of Tweet IDs associated with the revised version(s) of this Tweet. To get information such as how many more edits remaining, how much more time left to make edits to this Tweet, we include the `edit_controls` field. We are also including the `created_at` field to get the timestamp for when the Tweet was created. We simply print the Tweet ID, text, the creation time, edit controls related information and the list of Tweet IDs associated with this Tweet (in terms of revisions) to the console.

```python
import tweepy

# Replace bearer token below
client = tweepy.Client(bearer_token='REPLACE_ME')

response = client.get_tweet(id='1575590109000323073', tweet_fields=['edit_controls,created_at'])

tweet = response.data

print(tweet.id)
print(tweet.text)
print(tweet.created_at)
print(tweet.edit_controls)
print(tweet.edit_history_tweet_ids)
```

The response will look something like this:

```bash
1575590109000323073
hello

this is a test to make sure the edit button works https://t.co/NBkYlCIPrA
2022-09-29 20:55:29+00:00
{'edits_remaining': '4', 'is_edit_eligible': True, 'editable_until': '2022-09-29T21:25:29.000Z'}
['1575590109000323073', '1575590534529556480']
```

Because this Tweet is not a poll, nullcast, promoted Tweet etc., `is_edit_eligible` is marked as `true`.

If you want the Tweet objects for each Tweet in a Tweet’s edit history, you will have to use the `edit_history_tweet_ids` [expansion](https://developer.twitter.com/en/docs/twitter-api/expansions) as shown below:

```python
import tweepy

# Replace bearer token below
client = tweepy.Client(bearer_token='REPLACE_ME')

response = client.get_tweet(id='1575590109000323073', tweet_fields=['edit_controls,created_at'],
                            expansions=['edit_history_tweet_ids'])

for tweet in response.includes['tweets']:
    print(tweet.id)
    print(tweet.text)
    print(tweet.created_at)
```

The response will look something like this:

```bash
hello

this is a test to make sure the edit button works https://t.co/NBkYlCIPrA
2022-09-29 20:55:29+00:00
1575590534529556480
hello

this is a test to make sure the edit button works, we’ll let you know how it goes https://t.co/XbZmX572Xc
2022-09-29 20:57:11+00:00
```

## Checking if a Tweet can be edited any longer

In order to check if the Tweet is editable any longer, we can check if:

* `edits_remaining` is greater than 0 **AND**
* `editable_until` is in the future from the current time (this will also give us how many more minutes left until a Tweet can no longer be edited)

The example below shows how you can do this with Tweepy:

```python
import tweepy
from datetime import datetime

# Replace bearer token below
client = tweepy.Client(bearer_token='REPLACE_ME')

response = client.get_tweet(id='1575590109000323073', tweet_fields=['edit_controls,created_at'],
                            expansions=['edit_history_tweet_ids'])

tweet = response.data

edits_remaining = tweet.edit_controls['edits_remaining']

editable_until = tweet.edit_controls['editable_until']

time_now = datetime.now()

formatted_time_now = time_now.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3]

if edits_remaining == 0:
    print("This Tweet can no longer be edited")
else:
    if editable_until[:-1] < formatted_time_now:
        print("This Tweet can no longer be edited")
    else:
        print("This Tweet can be edited until {}".format(editable_until))
```

## How to check if a Tweet with a given ID is the most recent version of a Tweet

If a Tweet has edits, the `edit_history_tweet_ids` will have more than one Tweet ID. So, we will simply check if the length of this array is equal to 1. If it is, that means there are no edits for this Tweet. If the length of this array is greater than 1, then the last Tweet ID in this array is the latest 'edited' Tweet.

```python
import tweepy

# Replace bearer token below
client = tweepy.Client(bearer_token='REPLACE_ME')

response = client.get_tweet(id='1575590109000323073')

tweet = response.data

edit_history_tweet_ids = tweet.edit_history_tweet_ids

if len(edit_history_tweet_ids) == 1:
    print("There are no edits to this Tweet")
else:
    print("The latest version of this Tweet is {}".format(edit_history_tweet_ids[-1]))
```

I hope this tutorial is helpful in studying and understanding edited Tweets. Feel free to [reach out to me](https://twitter.com/suhemparack) with any questions and feedback!