縦型動画1本を40アカウントへ:エージェントが Shager でリールとショートを配信する方法
ショート動画を配信するエージェントの実践ガイド。フォーマット確認、リールとショートのメタデータ、アカウント別キャプション、分散配信、実際の MCP 呼び出し。

エージェントは、1本の縦型ショート動画を数十の Instagram、Facebook、YouTube アカウントに配信できます。やることは3つです。サイズと再生時間を添えて動画を1回アップロードし、ネットワークごとにフォーマットを指定した投稿を1つ作り、アカウントごとに違うキャプションを書く。Shager は送信前に、各ネットワークのルールに照らしてファイルを検証し、アカウントごとにランダムな間隔を空けながら配信していきます。エージェントの本当の仕事はアップロードではなく、メタデータです。
この最後の一文が、この記事の要点のすべてです。ショート動画の配信がうまくいかない原因が、動画そのものにあることはめったにありません。クリップが3分4秒あることをエージェントが知らなかった、あるいは40のアカウントに一字一句同じキャプションが届いた、というのが典型的な失敗です。
アップロード前に、エージェントはファイルの何を知っておくべきか
必要なのは、幅、高さ、再生時間の3つの数字です。ネットワークはこれらをもとにショート動画を分類し、受け付けるかどうかを判断します。推測で進めるエージェントは、意図しないフォーマットで公開されたり、拒否されたりする投稿を生みます。
いちばん明快なのは YouTube のルールです。Google 自身のヘルプページ「3 分間の YouTube ショート」によると、2024年10月15日以降にアップロードされた、正方形または縦長のアスペクト比で長さが3分以内の動画は、ショートに分類されます。つまり、9:16 で3分4秒のクリップは、エージェントの意図にかかわらず、ショートではなく通常の動画になります。
Instagram はアスペクト比の扱いがもう少し緩やかですが、それでも決まりはあります。Instagram Platform に関する Meta のコンテンツ公開ドキュメントには、リールで受け付けるコンテナとコーデックが記載されており、トリミングや余白を避けるために 9:16 が推奨されています。また、公開時には動画が公開でアクセスできる URL に置かれている必要があります。Meta がその URL から動画を取得するからです。
Shager の upload_media_from_url が、任意のフィールドとして width、height、duration_ms を受け付けるのはこのためです。これらを渡せば、リール、ショート、ストーリーズの検証はアップロード時と予約前に行われます。23番目のアカウントで投稿が失敗して初めて問題が見つかる、ということはありません。
エージェントがこれらの数字を持っていない場合は、アップロード前に取得すべきです。Claude Code や Codex なら、ffprobe を1回呼ぶだけです。
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height:format=duration \
-of json launch-teaser.mp4

MCP の呼び出し順序
38の接続済みアカウントを持つクライアントに対して、エージェントが https://app.shager.ai/api/mcp の Shager MCP サーバーを使って実行する手順を示します。ツール名は実際のもので、ID はダミーです。
whoamiで、キーがどのオーガニゼーションのものか、公開権限があるかを確認します。list_workspacesで、クライアントのワークスペースを探します。- そのワークスペースで
list_channelsを呼び、ネットワーク、状態、対応フォーマットを確認します。 list_groupsで、このキャンペーンの対象アカウントをまとめたグループを探します。- サイズと再生時間を添えて
upload_media_from_urlを呼びます。 - アカウント別のキャプションとネットワーク別のフォーマットを指定して、
create_postで下書きを作ります。 - クライアントが動画を承認する運用なら
request_approval、そうでなければschedule_postを呼びます。 - 予約時刻を過ぎたら
get_postで、すべてのアカウントの状態を確認します。
アップロードの呼び出しは次のとおりです。
{
"tool": "upload_media_from_url",
"arguments": {
"workspace_id": "ws_example",
"url": "https://cdn.example-agency.com/clients/aurora/launch-teaser.mp4",
"file_name": "launch-teaser.mp4",
"width": 1080,
"height": 1920,
"duration_ms": 42000
}
}
続いて下書きの投稿です。format がチャンネルごとに指定されている点に注目してください。同じファイルでも、Instagram と Facebook では REEL、YouTube では SHORT になるからです。
{
"tool": "create_post",
"arguments": {
"workspace_id": "ws_example",
"caption": "Aurora opens its new showroom on Thursday. 42 seconds inside.",
"media_ids": ["med_teaser"],
"youtube_title": "Inside the new Aurora showroom",
"youtube_privacy": "public",
"cta_url": "https://aurora-example.com/showroom",
"campaign": "showroom-launch",
"label": "Showroom teaser, week 38",
"per_channel": [
{ "channel_id": "ch_ig_downtown", "format": "REEL",
"caption": "Downtown team here. Thursday we open the doors, and this is what you'll see first." },
{ "channel_id": "ch_fb_northside", "format": "REEL",
"caption": "Northside customers asked for a showroom. Here's a 42 second look before Thursday." },
{ "channel_id": "ch_yt_main", "format": "SHORT",
"caption": "A first look at the new Aurora showroom, opening Thursday." }
],
"stagger_seconds": [45, 120]
}
}
実際の実行では、per_channel には3件ではなく全アカウント分のエントリが入ります。書くのはエージェントであって、人が書くべきものではありません。
なぜアカウントごとに別のキャプションが必要なのか
40のページが1時間以内にまったく同じ文章を投稿するのは、スパム検知の仕組みがまさに見つけようとしているパターンだからです。それに、2つのページをフォローしている人にとっても印象がよくありません。Shager 自身の auth.md でも、per_channel を使ってアカウントごとにキャプションを変えるよう、エージェントにはっきり伝えています。
よいバリエーションとは、類義語の置き換えではありません。エージェントは、それぞれのキャプションをそのアカウントに関する事実、たとえば所在地、チーム、オーディエンスに結びつけるべきです。方法の詳細は、言い回しを変えながらブランドのトーンを保つコツも含めて、AI でアカウントごとにキャプションを変えるで解説しています。
ショート動画の場合は、特にキャプションを短くしましょう。メッセージを伝えるのは動画です。ナレーションを繰り返すだけのキャプションは、スペースの無駄です。
ショート動画では、リンクをどこに置くのか
エージェントがいちばん間違えやすいのがここです。すべてのネットワークに同じルールを当てはめてしまうからです。
YouTube について、Google はヘルプセンターで、スパムを減らすためにショートのコメントと説明欄の URL はクリックできないと明記しています。ショートの最初のコメントに置いたリード獲得用のリンクは、リンクではなくただの文字列です。Instagram でも、キャプションやコメント内の URL はリンクとして表示されません。最初のコメントのリンクが期待どおりに機能するのは、Facebook ページの投稿です。
そのため、ショート動画を配信するときは、first_comment を役に立つチャンネルだけに設定し、ショートでは空にしておくべきです。それでも Shager は cta_url からアカウントごとに計測用の短縮リンクを生成するので、リンクが表示される場所ではどこでも、クリックのデータはアカウント別に記録されます。このやり方の全体像は、エージェントで最初のコメントにリード獲得リンクを置くにまとめています。

間隔の調整:stagger_seconds が実際にしていること
stagger_seconds は、同じネットワークのアカウント同士の間に入れるランダムな待ち時間(秒)です。デフォルトは [30, 90] です。38のアカウントが3つのネットワークに分かれている場合、各ネットワークのキューは独立して動きます。Instagram のアカウント同士、YouTube のチャンネル同士がそれぞれ間隔を空けて配信されます。
動画の場合、私はたいていこの幅を広げます。38アカウントを [45, 120] で配信すると終わるまでに時間はかかりますが、投稿がスクリプトではなく人が公開しているように見える時間幅に分散されます。クライアントが「この時刻までにすべて公開されていること」を重視するなら、間隔を詰めるのではなく、予約時刻を早めるべきです。タイミングについては、エージェントのための予約戦略で詳しく扱っています。
結果の確認
予約時刻を過ぎたら、エージェントは get_post を呼びます。投稿全体の状態と、アカウントごとの状態(公開時刻、公開された URL、またはエラー)が返ってきます。投稿のステータスには PUBLISHED、PARTIALLY_PUBLISHED、FAILED などがあり、そのほかは OpenAPI ドキュメントに記載されています。
規模が大きくなれば、PARTIALLY_PUBLISHED という結果はよくあることです。あるアカウントのトークンが期限切れになっていた、あるページが権限を失っていた、といった具合です。エージェントの仕事は、やみくもにリトライすることではなく、該当するアカウントを名前で人に報告することです。多くの場合、そのアカウントだけに新しいクライアント向け接続リンクを送れば解決します。
スクリプト向けの REST 版
チャットのエージェントではなくスクリプトからパイプラインを動かす場合、同じ2つのステップを REST で書くと次のようになります。
curl -s https://app.shager.ai/api/v1/workspaces/ws_example/media \
-H "Authorization: Bearer $SHAGER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://cdn.example-agency.com/clients/aurora/launch-teaser.mp4",
"file_name":"launch-teaser.mp4","width":1080,"height":1920,"duration_ms":42000}'
curl -s https://app.shager.ai/api/v1/workspaces/ws_example/posts \
-H "Authorization: Bearer $SHAGER_API_KEY" \
-H "Content-Type: application/json" \
-d @teaser-post.json
レスポンスは { "data": ... }、エラーは { "error": { "code", "message" } } の形で返ってきます。上限はキー1つあたり毎分120リクエストで、動画1本の配信で近づくことはまずありません。
よくある質問
横長の動画をショートとして投稿できますか?
できません。YouTube はアスペクト比と長さでショートを分類するので、横長の動画は指定した format にかかわらず通常の動画としてアップロードされます。編集担当に縦型の版を作ってもらうか、横長の版は YouTube で format を VIDEO にして投稿し、リールには縦型の版を使いましょう。
同じ動画を同じ日に全アカウントへ配信してよいですか?
キャプションを変え、間隔を広めに取れば可能です。大きなグループの場合、多くのエージェンシーは配信を2〜3日に分けています。そうすれば、各アカウントのオーディエンスが、近くのページが同じ時間帯に同じクリップを共有しているのを目にせずに済みます。エージェントは、グループごとに schedule_at の値を変えた別々の投稿を作ることで、これを実現できます。
あるアカウントで動画が拒否されたらどうなりますか?
Shager は送信前に、各アカウントをそのネットワークのルールに照らして確認するので、ほとんどの問題は予約の時点で明確な理由とともに見つかります。それでも公開時に何かが失敗した場合は、get_post でどのアカウントがなぜ失敗したのかがわかり、ほかのアカウントへの配信には影響しません。
次に読むもの
エージェントをまだ接続していない場合は、エージェント向けの入口から始めてください。MCP サーバー、REST API、セルフサインアップについて解説しています。そのうえで、クライアントのアカウント全体に向ける前に、小さなグループでショート動画を1本配信してみましょう。


