X の API キーなしでツイートを JSON で取得する方法

更新日
開発者アカウントなしで公開 X 投稿を JSON で読む、検証済みの 5 つの方法: FxTwitter、vxTwitter、syndication、oEmbed、UnifAPI。
要点: 公開投稿 1 件を JSON で読むのに、X の開発者アカウントは要りません。2026 年 10 月 7 日、私たちは同じ NASA の投稿を、キーなしで応答する 5 か所から
curlで取得しました。FxTwitter と vxTwitter は、投稿 1 件またはユーザー 1 件について整った JSON オブジェクトを返します。X 自身の syndication エンドポイントも投稿を JSON で返しますが、ドキュメント化されておらず、いつ変わってもおかしくありません。X の oEmbed エンドポイントが返すのは JSON に包まれた HTML スニペットで、データではありません。UnifAPI の/tools/x/post(ログイン不要で無料、訪問者ごとのレート制限付き)は、著者、メディア、引用元の投稿、すべての指標を含む投稿を、検索、返信、タイムラインの各エンドポイントと同じフィールド名で返します。投稿 1 件しか要らないなら FxTwitter で十分です。その投稿が、続けて検索し、返信を読み、タイムラインをたどるワークフローの最初の一歩なら、それらすべてでエンベロープが変わらないエンドポイントを使ってください。
「ツイートを JSON で取得するには」という問いの答えは、2022 年とは変わりました。公式 API は今も動きますが、無料枠はエージェントなら午後のうちに使い切るトークン配分で、有料枠は数件の読み取りのために月額を払うには見合わない額から始まります。一方で、埋め込みやリンクプレビューの用途を中心に公開エンドポイントが育ち、認証情報なしの素の HTTP リクエストに答えてくれるようになりました。
この記事は、何を作るか決める前に私たちが行ったテストです。以下のリクエストはすべて再現可能なので、コマンドをコピーして実行してみてください。
テスト
公開投稿 1 件、https://x.com/NASA/status/2107237881668313108 を、デフォルトの User-Agent、Cookie なし、キーなしの curl で取得しました。記録したのは、ステータスコード、コンテンツタイプ、そして本文に投稿のテキストといいね数が構造化フィールドとして含まれていたかです。
| エンドポイント | ステータス | 本文 | テキストと指標がフィールドとして | メディア URL | 引用元の投稿 | 他にできること |
|---|---|---|---|---|---|---|
api.fxtwitter.com/NASA/status/<id> | 200 | JSON、3.3 KB | あり | あり | あり | ユーザー 1 件 |
api.vxtwitter.com/NASA/status/<id> | 200 | JSON、1.6 KB | あり | あり | あり(URL) | なし |
cdn.syndication.twimg.com/tweet-result?id=<id>&token=x | 200 | JSON、3.2 KB | いいね数と返信数のみ | あり | あり | なし |
publish.twitter.com/oembed?url=… | 200 | HTML を包んだ JSON | なし(HTML の blockquote) | なし | なし | なし |
unifapi.com/tools/x/post?id=<id> | 200 | JSON、検索・返信・プロフィールと同じモデル | あり | あり | あり | 検索、返信、メディア、フォロワー、トレンド、コミュニティ |
この表のどれにもキーは要りません。5 つのうち 3 つは、投稿の使えるレコードを返します。違いは、ほかに何ができるか、どれだけ安定しているか、そしてタスクが大きくなったときに同じフィールド名を使い続けられるかにあります。
FxTwitter と vxTwitter: リンクプレビューのために作られ、読み取りには十分
どちらのプロジェクトも、Discord や Telegram で X のリンクを展開するために存在します。API はその副産物ですが、よくできた副産物です。
curl -s "https://api.fxtwitter.com/NASA/status/2107237881668313108" | jq '.tweet | {text, likes, retweets, views, created_at}'
テキスト、いいね・リポスト・返信・表示の各カウント、著者オブジェクト、サイズと MP4 バリアント付きのメディア、引用元の投稿、created_at のタイムスタンプを返します。vxTwitter はよりフラットなオブジェクトで、同じ要点と mediaURLs 配列を返します。
できないこと: 検索、投稿の下の返信、ユーザーのタイムライン、フォロワー。ユーザーエンドポイント(api.fxtwitter.com/NASA)はカウントと自己紹介を返しますが、投稿は返しません。また、ボランティアのインフラで動いていて、公表されたレート制限もないので、何百もの投稿に展開するワークフローは顧客ではなく客人の立場です。
X の syndication エンドポイント: 公式、非公開、壊れやすい
X は埋め込みタイムラインを cdn.syndication.twimg.com から配信しています。投稿 1 件向けの変種は JSON で答えます。
curl -s "https://cdn.syndication.twimg.com/tweet-result?id=2107237881668313108&token=x" | jq '{text, favorite_count, created_at, user: .user.screen_name}'
X 自身の埋め込みウィジェットが描画するデータなので正確ですが、含まれるのはウィジェットが表示するものだけです。favorite_count と conversation_count はあっても、リポストも表示数もありません。ドキュメント化もされておらず、token パラメータの意味は何度も変わっていて、投稿によってはテキストの代わりに tombstone を持つスタブが返ります。照合用に使い、依存先にはしないでください。
oEmbed: データではない
publish.twitter.com/oembed は、CMS が投稿を埋め込むときに使うエンドポイントです。JSON を返しますが、ペイロードはテキストを中に含む HTML の blockquote と script タグです。指標もメディア URL もありません。テキストが欲しければ JSON から HTML をパースすることになり、両方の悪いところ取りです。
UnifAPI の無料投稿エンドポイント
curl -s "https://unifapi.com/tools/x/post?id=2107237881668313108"
{
"post": {
"id": "2107237881668313108",
"text": "Time to bring them home 🌎\n\nAfter nearly eight months aboard the @Space_Station, the four members of Crew-12 will soon head back to Earth…",
"createdAt": "2026-10-05T22:33:56.000Z",
"language": "en",
"url": "https://x.com/NASA/status/2107237881668313108",
"author": {
"id": "11348282",
"handle": "NASA",
"name": "NASA",
"verified": true,
"followers": 92373840
},
"metrics": {
"likes": 7210,
"reposts": 846,
"replies": 262,
"quotes": 60,
"bookmarks": 197,
"views": 2823329
},
"media": [
{
"kind": "photo",
"url": "https://pbs.twimg.com/media/HT5pcNwXwAAKdoM.jpg",
"width": 2048,
"height": 1365
}
],
"quoted": null
}
}
id パラメータは完全な x.com または twitter.com のステータス URL も受け付けるので、エージェントはユーザーが貼り付けたものをそのまま渡せます。format=md を付けるか Accept: text/markdown を送れば、同じ投稿を Markdown で受け取れます。モデルのコンテキストに入れるなら、JSON より安上がりです。
エージェントにとって重要な性質が 3 つあります。
- エンベロープが共通。
post、author、metrics、mediaは、/tools/x/search、/tools/x/replies、/tools/x/profile、/tools/x/mediaでも同じ形です。どれか 1 つで.metrics.likesを読むプロンプトは、すべてで動きます。 - 制限が明記されている。 すべてのレスポンスに
X-RateLimit-Limit、X-RateLimit-Remaining、X-RateLimit-Resetが付きます。無料の上限は訪問者ごとに 10 分あたり 20 回の照会で、検索は 2 回分として数えます。429 にはRetry-Afterと、上限を引き上げられる URL(従量課金でサブスクリプション不要の X / Twitter API)が含まれます。 - エラーに型がある。 id の欠落や不正は
{ "error": { "type": "validation_error", … } }、削除済みの投稿はnot_foundです。エージェントはメッセージをパースせずにerror.typeで分岐できます。
全パラメータ表と、各エンドポイントで実際に取得したサンプルは、各ツールの Markdown ページ(例: /tools/x-post-viewer/index.md)と /llms.txt にあります。
どれを使うか
- リンクを展開するボットで投稿 1 件: FxTwitter。そのために作られたものです。
- 投稿のテキストが X の配信どおりかの照合: syndication エンドポイント。
- もっと大きな何かの第一歩としての投稿(読んで、返信を読んで、反応を検索して、誰が返信したかを見る): UnifAPI の無料エンドポイント。次のステップが存在し、形を共有しているからです。
- 量、直近のウィンドウを超える履歴、保証: ワークスペースキー付きの従量課金 API。フィールド名は無料エンドポイントと一致するので、プロンプトは変わりません。
FAQ
公開ツイートを読むのに Twitter の開発者アカウントは必要ですか?
いいえ。この記事の 5 つのエンドポイントはすべて、開発者アカウントなしで応答します。公式 API が必要なのは、書き込み、非公開データ、保証されたスループットのためです。
x.com を直接スクレイプするのは選択肢になりますか?
curl では無理です。x.com/NASA/status/<id> は 147 KB の HTML シェルを返し、投稿はページ読み込み後に JavaScript で描画されます。ヘッドレスブラウザが必要になり、遅く、コストがかかり、マークアップが変わると壊れます。
UnifAPI のエンドポイントで保護されたアカウントの投稿は読めますか?
いいえ。保護された投稿と削除済みの投稿は not_found を返します。エンドポイントは公開データだけを読み、X のプライバシー設定を迂回することはありません。
無料の上限は?
訪問者ごとに 10 分あたり 20 回の照会で、すべての /tools/x/* エンドポイントの合算です(検索は 2 回分として数えます)。レスポンスヘッダーに表示されます。利用は無料で、ログインもアカウントも不要です。上限の引き上げは UnifAPI のワークスペースキーによる従量課金で、申請して取得する無料キーの枠はありません。