X API (Twitter API) で "-is:retweet" が動かなくなった

# 初めに
私は Xのポスト（Twitter の ツイート）を Search API を利用し、データ検索しています。
しかし、最近、やたらと検索結果が増えていることに気がつきました。
理由を追いかけてみると、なんと 「is:retweet」 が利用できなくなっていたので思わず Qiitaに書き込んでいます。

# 今まで動いていたクエリ
この問題が発生するまでは以下のクエリ条件で検索をおこなうことができました。
```
query = "#XXXXX OR #YYYYY -ZZZZ has:images -is:retweet"
```
この検索条件は タグ「XXXX」またはタグ「YYYY」があり、かつキーワードZZZZ を含まない、かつ画像が添付されており、かつリツイートは除く。という条件です。

この内、`-is:retweet` が動作していないことに気づきました。

# 答えはドキュメントにある（はず）
ドキュメントの Search API を開いて見ましたが、`is:retweet` が見つかりません。
まさかと思い検索してみたところいくつかヒットします。

https://developer.x.com/en/search-results?limit=10&offset=0&q=is%3Aretweet&searchPath=%2Fcontent%2Fdeveloper-twitter%2Fen&sort=relevance

![スクリーンショット 2024-09-22 18.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/26b735b4-e24b-33e0-ddfd-9390048e6a56.png)

まずは一つ目の「Building initial filters」を開いてみます。

![スクリーンショット 2024-09-22 18.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/ddcde8db-0820-7e90-424e-3935336d98e0.png)

ありました。やはり、`is:retweet` は使えそうです。

２つ目の「Full-archive search - Metadata and filtering timeline」を開いてみます。

![スクリーンショット 2024-09-22 18.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/2389b91a-6691-ac82-fb31-8cfba0725598.png)

ありますね。　とその時、、、

![スクリーンショット 2024-09-22 18.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/c736447b-a6c9-e77d-0194-284801fd9b08.png)

え、えんたーぷらいず？！

まさかと思い、左のメニューの「Enterprise - Gnip 2.0 > Search API」 をクリックし、`is:retweet` を Cntr+F で検索します。

![スクリーンショット 2024-09-22 18.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/65f0299a-7a2d-f2fd-92e0-5b7252de0fae.png)

**Enterprise search APIs support rules** と書かれてますね。
左メニューをもう一度見ています。

![スクリーンショット 2024-09-22 18.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/d72ef605-713a-970f-e69b-25edfc524ee8.png)

**X API v2** と **Enterprise - Gnip 2.0** というのが並んでいます。
わたしが初めにチェックした **X API v2** > **Tweets** > **Search Tweets** をもう一度開いて次は `Enterprise` を検索してみます。

https://developer.x.com/en/docs/x-api/tweets/search/introduction

![スクリーンショット 2024-09-22 18.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/2160989b-2607-9a33-cd19-81a2afaf79f6.png)

> When using a Project with regular access, you can use the basic set of operators and can make queries up to 512 characters long. When using a Project with Enterprise access, you have access to additional operators. Projects with Enterprise Access can make queries up to 4096 characters long.

Basic レベルの契約だと [operators](https://developer.x.com/en/docs/x-api/tweets/search/integrate/build-a-rule) が使える、Enterprise なら もっっと使えると書いてあります。
ちなみに、[operators](https://developer.x.com/en/docs/x-api/tweets/search/integrate/build-a-rule) 先はエラーページです。

![スクリーンショット 2024-09-22 18.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1005574/e6a73746-f6c2-0b25-2ac9-2f56d721e66f.png)

そのため、 Basic で使える Operator は不明ですが、ほぼ間違いなく `is:retweet` は Enterprise じゃないと使えなさそうです。

マジですか....


# どうしたか

流石に Enterprise は契約できません...
さらにAPI チェックすると `tweet.fields` に `referenced_tweets` を発見しました。これはリポスト（リツイート）などの場合に元のポスト（ツイート）のリストが含まれる場所です。

https://developer.x.com/en/docs/x-api/data-dictionary/object-model/tweet

よって、Search API の結果から  `referenced_tweets` をチェックし、存在する場合はリポスト（リツイート）であるとして除外できそうです。
また、リポスト（リツイート）の場合は 取得した Tweet の　`text` 属性の値に `RT ` があることも見つけました。わたしの場合はこちらを利用して除外するようにしました。

# まとめ
X API (Twitter API) の変更に伴い、"-is:retweet" が Enterprise でのみ有効化なパラメータになり、 それ以下のレベルでは Search API の結果にリポスト(リツイート)が含まれるようになりました。その結果、Search API の結果から除外するロジックの実装が必要になりました。
また、Basic レベルの場合は Search API の limit もあるため、使い切らないように考えて利用する必要があり、かなり辛い変更です。
X(Twitter) API が有料化されて半年ほど経ちましいたがどんどん料金がかかるようになってきましたね。。。

おわり