2026年7月3日更新:Sorsa のメディア料金を1,000ツイートあたりのバッチ基準で述べ直し、100回分の無料リクエストの開始枠を追加し、2026年4月の更新後の公式 X API のリソース単位レートを再確認し、yt-dlp のネイティブ X エクストラクターを再検証しました。
要点: API で Twitter(X)のメディアをダウンロードするには、ツイートを要求し、そのメディアオブジェクトを読んで直接のファイル URL を得ます。公式 X API は、expansions を通じて variants 配列の中に動画リンクを返し、サードパーティの REST API は1回の呼び出しでそれらを返します。画像は pbs.twimg.com から、動画は video.twimg.com から取得されます。
コードで Twitter のメディアを取得する際に難しいのは、ダウンロードそのものであることはめったにありません。難しいのは、OAuth フローも、壊れやすいスクレイピングも、リソース単位の課金もなしに、大規模にきれいで直接的なメディア URL を得ることです。Twitter/X の代替 API である Sorsa API は、すべてのツイートのメディアリンクを完全な作者プロフィールと並べて1回のリクエストで返し、1回のバッチ呼び出しで最大100件のツイート ID を受け付け、すべてのプランで一律の毎秒20リクエストで動作します。バッチ処理すれば、メディア抽出は1,000ツイートあたり$0.02から、メディアと作者データ込みになるため、数千の投稿にまたがる取得でも、公式 API の積み重なるリソース単位の読み取りではなく、数セントで済みます。
本ガイドは、開発者が2026年に実際に使う3つのアプローチを扱います。公式 X API、オープンソースの yt-dlp、そしてマネージドな Twitter/X データ API です。それぞれについて、動作するリクエスト、実際のコスト、そしてどれがどの用途に合うかの明快な見取り図が得られます。
目次
- ツイートにメディアはどう添付されるか
- 方法1:公式 X API(expansions と variants)
- 方法2:単発・ローカル保存のための yt-dlp
- 方法3:マネージドな Twitter/X データ API
- 3つの方法の比較
- タイムラインや検索の全体からメディアをダウンロードする
- 画質:フル解像度の写真を得る
- 法律と利用規約
- 実例
- よくある質問
- 始め方
ツイートにメディアはどう添付されるか {#how-media-is-attached-to-a-tweet}
ツイートはメディアファイルそのものを含んでいません。含んでいるのはメディアオブジェクトへの参照で、それらのオブジェクトが X のコンテンツサーバーにホストされたファイルを指しています。画像は pbs.twimg.com に、動画は video.twimg.com に、たいてい amplify_video のようなパスの下に存在します。何かをダウンロードするには、ツイートを取得し、そのメディアオブジェクトを見つけ、直接 URL を読みます。
2つの細部が人をつまずかせます。動画は、異なるビットレートの1つ以上の MP4 variants として配信されるため、「動画 URL」は実際にはリストであり、最も高ビットレートのファイルを選びます。X では GIF はまったく GIF ではありません。プラットフォームはそれらを無音のループ MP4 として保存するため、GIF のダウンロードは MP4 を返します。写真はもっと単純で、各メディアオブジェクトは1つの画像 URL を持ち、元のアップロードはタイムラインに表示される圧縮されたコピーより大きく鮮明です。
以下の各方法は、その同じメディアオブジェクトに到達する異なる手段です。違いは、認証、コスト、どれだけパースするか、そして数千の投稿にまたがって実行したときにそのアプローチが持ちこたえるかにあります。
方法1:公式 X API(expansions と variants) {#method-1-the-official-x-api}
公式 X API はメディア URL を返せますが、明示的に要求したときだけです。デフォルトでは、ツイートのレスポンスは id と text しか持ちません。メディアを得るには、添付されたメディアキーの expansion と、欲しいメディアフィールドを追加し、レスポンスの includes.media セクションから結果を読みます。
curl "https://api.twitter.com/2/tweets/TWEET_ID?expansions=attachments.media_keys&media.fields=variants,url,preview_image_url&tweet.fields=attachments" \
-H "Authorization: Bearer $BEARER_TOKEN"
動画の場合、メディアオブジェクトは variants 配列を返し、各エントリは bit_rate と url を持ちます。bit_rate でソートして、最上位の MP4 を取ります。写真の場合、オブジェクトは url を直接返します。動画 URL は v2 のローンチ時には利用できず、後にこの expansion を通じて登場しました。多くの開発者が最初の試みで空のレスポンスを得るのはこのためです。
この方法は権威あるもので、公式の書き込みアクションやコンプライアンスフィードも必要なときには唯一の経路です。問題はコストと手間です。2026年4月の料金改定 後に有効な従量課金モデルの下では、公式 API には無料プランがなく、リソース単位で課金します。おおよそ1投稿の読み取り$0.005、1ユーザーの読み取り$0.010で、メディアはその上に独自のリソースとして数えられます(レートは2026年7月確認)。従量課金アカウントは月200万投稿の読み取りが上限で、認証は Bearer トークンを用いた OAuth 2.0 です。1件のツイートならこれで問題ありません。ツイート、そのメディア、その作者を大量に読むパイプラインでは、リソース単位のメーターが速く上がり、パースの負担は自分に残ります。
方法2:単発・ローカル保存のための yt-dlp {#method-2-yt-dlp}
yt-dlp は、ディスクにファイルが1つ欲しいだけのときに多くの開発者が手に取る、オープンソースのコマンドラインダウンローダーです。youtube-dl のメンテナンスされたフォークで、頻繁に更新され、1,800以上のサイトをカバーし、Twitter/X をネイティブにサポートします。1件の公開動画なら1行です。
yt-dlp "https://x.com/USER/status/TWEET_ID"
デフォルトで最高画質を選び、必要に応じて FFmpeg を使ってストリームを結合するため、FFmpeg も併せてインストールします。自分の投稿やログインの背後にあるものには、サインイン済みのブラウザセッションからクッキーを渡します。
yt-dlp --cookies-from-browser chrome "https://x.com/USER/status/TWEET_ID"
yt-dlp は、個人的なアーカイブ、自分のコンテンツの変形的利用、手早いスクリプトには優れています。本番のメディアパイプラインには、3つの理由でやや不向きです。構造化された URL やメタデータではなくダウンロード済みのファイルを渡すため、メディアリンクのデータベースを構築するには、その出力を自分でパースする必要があります。エクストラクターは X がページ構造を変えるたびに壊れるため、バージョンを固定し、定期的に作り直すことになります。そして1台のマシンから大きなバッチにわたって実行すると、マネージドなエンドポイントを呼ぶのではなくフロントエンドをスクレイピングしているため、IP のレート制限やブロックを招きます。非公開アカウント、有料の Creator コンテンツ、ダイレクトメッセージは認証の背後にあり、許可なしには対象外です。
方法3:マネージドな Twitter/X データ API {#method-3-a-managed-twitter-x-data-api}
マネージドな Twitter/X データ API は、OAuth のセットアップと variant のパースの両方を取り除きます。Sorsa では、Tweet Data エンドポイント への1回の呼び出しが、完全なツイート、そのメディア、そして完全な作者プロフィールを返し、単一の ApiKey ヘッダーで認証します。
curl -X POST "https://api.sorsa.io/v3/tweet-info" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tweet_link": "https://x.com/USER/status/TWEET_ID"}'
レスポンスは entities 配列を持ち、各メディア項目はその type(photo、video、または url)、ファイルへの直接の link、そして preview サムネイルを列挙します。
{
"id": "1782368585664626774",
"full_text": "Example tweet text",
"entities": [
{
"type": "video",
"link": "https://video.twimg.com/amplify_video/.../vid.mp4",
"preview": "https://pbs.twimg.com/.../thumb.jpg"
}
],
"user": { "username": "user", "followers_count": 100000 }
}
要求する expansions も、ソートする variants 配列も、トークンの更新もありません。既知の投稿セットには、Tweet Data(バッチ)エンドポイント が最大100件のツイート ID を受け取り、それらすべてを1つの課金対象リクエストとして返します。
curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tweet_links": ["TWEET_ID_1", "TWEET_ID_2", "TWEET_ID_3"]}'
Sorsa はリソース単位ではなく呼び出し単位で1リクエストを課金するため、すべてのツイートに付く作者プロフィールは追加費用なしで含まれ、メディアの別料金もありません。バルクエンドポイントでバッチ処理すると、メディア抽出は1,000ツイートあたり$0.02から動作します。Starter で1,000あたり$0.049、Pro で$0.02、Enterprise で$0.018で、すべてのメディアリンクと作者プロフィールが返されます。単体のプロフィール取得は1,000あたり$0.01からです。同じ1,000投稿は、公式 X API では、別途のメディアと作者ごとの読み取りの前に、投稿の読み取りだけで$5.00から始まります(2026年7月確認)。プランの詳細は フラット料金のプラン にあります。
たまにファイルが1つ欲しいだけ、あるいは開発者でないなら、同じエンジンがノーコードの Twitter メディアダウンローダー を動かしています。ツイートのリンクを貼り付ければ、MP4 やフル解像度の画像が得られ、キーは不要です。
3つの方法の比較 {#comparison}
各方法にはそれぞれ得意な用途があります。以下の選定はそれぞれに最も強い用途を割り当て、続いてコスト表が、フラット料金モデルが公式 API を上回る箇所を示します。
単発の保存とローカルアーカイブ: yt-dlp。ディスクにファイルが1つ欲しいだけで、維持の手間を吸収できるときの無料のコマンドラインツールです。
公式の書き込みアクションやコンプライアンスフィード: 公式 X API。投稿、ダイレクトメッセージ、ライセンスされたデータに必須の経路です。
多数の投稿にまたがる読み取りの多いメディア抽出: Sorsa。バッチ呼び出しでのフラットなリクエスト単位の課金、構造化された URL、そして作者データ込みです。
書き込みアクセスやライセンスされたデータが必要なら、それは公式 API の領分です。フラットで予測しやすい価格での読み取りの多いメディアアクセスには、マネージドな代替に分があり、その作業では公式 X API より最大50分の1のコストで済み、バッチ取得がその差をさらに広げます。yt-dlp は無料で実行できますが自分で動かす必要があるため、実際のパイプラインを左右するコスト比較は公式 API に対するものです。
| メディアと作者込みで1,000ツイートを取得するコスト | 公式 X API | Sorsa API(バッチ) |
|---|---|---|
| 課金単位 | 取得したリソース単位 | リクエスト単位 |
| 投稿の読み取り | $5.00 | 込み |
| 作者の読み取り | $10.00 | 込み |
| 1,000ツイートあたりのコスト | メディア別で$15.00 | $0.02から |
1回の Sorsa リクエストは最大100ツイートまたは200プロフィールを返すため、1,000ツイートは10回のバッチ呼び出しで、すべてのツイートの作者プロフィールは無料です(2026年7月確認)。
タイムラインや検索の全体からメディアをダウンロードする {#download-media-from-a-whole-timeline-or-search}
実際の作業のほとんどは1件のツイートではありません。あるプロフィールが投稿したすべての動画、あるいはクエリに一致するすべての画像が欲しいのです。パターンは、ツイートを列挙し、それぞれからメディアリンクを集め、それからファイルを取得することです。
User Tweets エンドポイント でプロフィールの投稿を取得します。これは1ページあたり約20件のツイートを、その entities とともに返します。next_cursor をたどって残りを順に取得します。
curl -X POST "https://api.sorsa.io/v3/user-tweets" \
-H "ApiKey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "USERNAME"}'
キーワードやハッシュタグには、Search Tweets エンドポイント に差し替え、同じ entities フィールドからメディアを読みます。ツイート ID のセットが手に入れば、バッチエンドポイントが最大100件を1つのリクエストにまとめ、リクエスト数も請求額も低く保ちます。全体のフローはいくつかのエンドポイントとループだけで、OAuth も、維持すべきフロントエンドのスクレイピングもありません。スクリプトによる構成から移行する開発者は、しばしばこれを Python で X データを取得する ガイドと組み合わせます。
画質:フル解像度の写真を得る {#image-quality}
タイムラインで見る写真は、素早く読み込むよう調整された圧縮プレビューであって、元画像ではありません。右クリックで保存したり、最初に見た URL をつかんだりすると、しばしば縮小されたコピーが残ります。メディアオブジェクトの画像 URL は元のアップロードを指しており、ピクセル寸法で数倍大きく、目に見えて鮮明なことがあります。
これが最も重要になるのは、ピクセルが情報を担っているとき、つまりインフォグラフィック、テキストのスクリーンショット、グラフ、あるいは OCR や学習セットに向かうあらゆる画像です。マネージド API はフル解像度のリンクを直接返すため、サイズパラメータを継ぎ合わせたり、元画像を推測したりする必要はありません。画像が作業のすべてであるときは、Twitter 画像を API でダウンロードする 専用の解説が写真の経路を最初から最後まで扱い、ラベル付きコーパスを組み立てるチームは 機械学習用のTwitterデータセットの構築 の手順に従えます。データセットやアーカイブでは、後でより鮮明なコピーを取り直すより、元画像を一度で取得しておくほうが確実です。
法律と利用規約 {#legal-and-terms-of-service}
個人的な参照や内部分析のために公開されたメディアをダウンロードすることは、概ね許容されます。作成者の許可なしに再投稿、再配布、または商用利用することは、著作権や X の利用規約に違反し得ます。そのリスクは、取得したツールではなく、ファイルをどう使うかにあります。非公開・保護されたアカウントは許可なしには対象外で、エンドポイントへ過度なリクエストを送り続けるのではなく、レート制限を尊重すべきです。用途が公開向けの場合、安全な手は、作成者にクレジットを付けるか許可を得ることです。
実例 {#in-practice}
約15人のメディアモニタリングのスタートアップは、ブランドセーフティ製品が予算を超え続けたため、フラット料金の API に移行しました。チームは公式 API から動画 URL を読んでいましたが、そこではリソース単位のメーターが、各投稿の読み取り、各メディアリソース、各作者の照会に対して別々に課金していました。ニュースの急増時には、その量が200万投稿の読み取り上限に迫り、OAuth と variants のパースは恒常的な維持コストでした。読み取り処理を100ツイートあたり1つのバッチリクエストにまとめたことで、メディア読み取りの費用は1,000ツイートあたり数ドルから約2セントへと、90%超の削減になり、呼び出しを単一の ApiKey リクエストにまとめたことで、一群のトークンとパースのバグがなくなりました。ブランドモニタリングのワークフロー を運用するチームにとって、課金モデルを読み取りの多い負荷に合わせることが、何よりの決め手です。
よくある質問 {#faq}
公式 X API で Twitter 動画をダウンロードできる?
はい。公式 X API は、メディア expansion の attachments.media_keys を media.fields=variants とともに要求すると、動画リンクを返します。動画は異なるビットレートの MP4 variants の配列として返り、最も高いものを選びます。写真は単一の url を返します。これは機能しますが、リソース単位で課金し、OAuth 2.0 を必要とします。
ツイートから直接の MP4 URL をどう得る?
ツイートのメディアオブジェクトを取得し、その動画 variants の中で最も高ビットレートのエントリを読みます。これが video.twimg.com 上の直接の MP4 です。画像は pbs.twimg.com 上の元ファイルの URL を返します。マネージドな Twitter/X API は、公式 API が必要とする expansion とパースの手順なしに、これらのリンクをレスポンスで返します。
OAuth なしで Twitter メディア URL を返す API はある?
はい。Twitter/X の代替 API である Sorsa API は、各ツイートのメディアリンクと完全な作者プロフィールを、単一の ApiKey ヘッダーで認証した1回のリクエストで、OAuth フローなしに返します。1回の呼び出しで最大100ツイートをバッチ処理し、すべてのプランで一律の毎秒20リクエストで動作するため、大規模なメディア取得に向いています。
yt-dlp は2026年に Twitter/X の動画をダウンロードできる?
はい。yt-dlp はネイティブの Twitter/X エクストラクターを持ち、活発にメンテナンスされ、FFmpeg を使ってストリームを結合しながら、1つのコマンドで公開ツイートの動画をダウンロードします。ログインの背後にあるコンテンツには、サインイン済みセッションのクッキーが必要です。エクストラクターは X がマークアップを変えると壊れるため、マネージドなパイプラインより、単発・ローカルのアーカイブに最適です。
大規模に Twitter メディアをダウンロードするといくらかかる?
公式 X API では、メディアの読み取りはリソース単位で課金され、おおよそ1投稿の読み取り$0.005に加えて別途のメディアと$0.010のユーザー読み取りがあり、月200万投稿の読み取りが上限です。Sorsa のようなフラット料金の API は代わりにリクエスト単位で課金するため、1,000ツイートをバッチ処理すると、Proプランで1,000あたり$0.02から、約2セントで、メディアと作者データ込みです。
API でフル解像度の画像をダウンロードできる?
はい。メディアオブジェクトの画像 URL は、タイムラインに表示される圧縮プレビューではなく、元のアップロードファイルを指しており、元画像はしばしばピクセル寸法で数倍大きいです。フル解像度のリンクを取得することは、インフォグラフィック、テキストのスクリーンショット、OCR、そして画像の細部がデータの一部であるデータセットにとって重要です。
始め方 {#getting-started}
多数の投稿にまたがる構造化されたメディアアクセスが目的なら、セットアップに審査の順番待ちはなく、数分で済みます。すべての新規アカウントは100回分の無料リクエストで始まります。1回限りの枠で、クレジットカード不要・有効期限なし、40個のエンドポイントすべてをカバーし、最大10,000ツイートまたは20,000プロフィールに十分です。キーを作成し、単一の ApiKey ヘッダーで最初の呼び出しを行います。OAuth も開発者アカウントの審査もありません。Sorsa のクイックスタート が最初のレスポンスまで素早く導き、一律の毎秒20リクエストがすべてのプランに適用されます。単発の保存には、ノーコードのメディアダウンローダーがキーをまったく必要としません。
監修:Keksich(Sorsa創業者、マーケター兼X APIリサーチャー)
本ガイドは、Sorsa の読み取り専用 Twitter/X API を運用する当チームの日々の作業に基づいており、すべてのエンドポイントとコードサンプルは執筆時に稼働中の v3 API に対して確認しました。公式 API の経路は、メディア expansion と variants フィールドについて X の開発者ドキュメントに対して検証しました。コストの数値は、2026年4月の更新時点での X の従量課金レートと、Sorsa の公開プランを用いています。yt-dlp の現行の X エクストラクターは、メンテナンスされているプロジェクトに対して確認しました。3つの取得方法、すなわち公式 X API、yt-dlp、Sorsa を比較しました。2026年7月確認。チームの詳細は Sorsa の About ページ にあります。