# 縦型動画1本を40アカウントへ：エージェントが Shager でリールとショートを配信する方法

_2026-09-15 · ショート動画を配信するエージェントの実践ガイド。フォーマット確認、リールとショートのメタデータ、アカウント別キャプション、分散配信、実際の MCP 呼び出し。_

エージェントは、1本の縦型ショート動画を数十の Instagram、Facebook、YouTube アカウントに配信できます。やることは3つです。サイズと再生時間を添えて動画を1回アップロードし、ネットワークごとにフォーマットを指定した投稿を1つ作り、アカウントごとに違うキャプションを書く。Shager は送信前に、各ネットワークのルールに照らしてファイルを検証し、アカウントごとにランダムな間隔を空けながら配信していきます。エージェントの本当の仕事はアップロードではなく、メタデータです。

この最後の一文が、この記事の要点のすべてです。ショート動画の配信がうまくいかない原因が、動画そのものにあることはめったにありません。クリップが3分4秒あることをエージェントが知らなかった、あるいは40のアカウントに一字一句同じキャプションが届いた、というのが典型的な失敗です。

## アップロード前に、エージェントはファイルの何を知っておくべきか

必要なのは、幅、高さ、再生時間の3つの数字です。ネットワークはこれらをもとにショート動画を分類し、受け付けるかどうかを判断します。推測で進めるエージェントは、意図しないフォーマットで公開されたり、拒否されたりする投稿を生みます。

いちばん明快なのは YouTube のルールです。Google 自身のヘルプページ「[3 分間の YouTube ショート](https://support.google.com/youtube/answer/15424877?hl=en)」によると、2024年10月15日以降にアップロードされた、正方形または縦長のアスペクト比で長さが3分以内の動画は、ショートに分類されます。つまり、9:16 で3分4秒のクリップは、エージェントの意図にかかわらず、ショートではなく通常の動画になります。

Instagram はアスペクト比の扱いがもう少し緩やかですが、それでも決まりはあります。Instagram Platform に関する Meta の[コンテンツ公開ドキュメント](https://developers.facebook.com/docs/instagram-platform/content-publishing)には、リールで受け付けるコンテナとコーデックが記載されており、トリミングや余白を避けるために 9:16 が推奨されています。また、公開時には動画が公開でアクセスできる URL に置かれている必要があります。Meta がその URL から動画を取得するからです。

Shager の `upload_media_from_url` が、任意のフィールドとして `width`、`height`、`duration_ms` を受け付けるのはこのためです。これらを渡せば、リール、ショート、ストーリーズの検証はアップロード時と予約前に行われます。23番目のアカウントで投稿が失敗して初めて問題が見つかる、ということはありません。

エージェントがこれらの数字を持っていない場合は、アップロード前に取得すべきです。Claude Code や Codex なら、`ffprobe` を1回呼ぶだけです。

```bash
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 はダミーです。

1. `whoami` で、キーがどのオーガニゼーションのものか、公開権限があるかを確認します。
2. `list_workspaces` で、クライアントのワークスペースを探します。
3. そのワークスペースで `list_channels` を呼び、ネットワーク、状態、対応フォーマットを確認します。
4. `list_groups` で、このキャンペーンの対象アカウントをまとめたグループを探します。
5. サイズと再生時間を添えて `upload_media_from_url` を呼びます。
6. アカウント別のキャプションとネットワーク別のフォーマットを指定して、`create_post` で下書きを作ります。
7. クライアントが動画を承認する運用なら `request_approval`、そうでなければ `schedule_post` を呼びます。
8. 予約時刻を過ぎたら `get_post` で、すべてのアカウントの状態を確認します。

アップロードの呼び出しは次のとおりです。

```json
{
  "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` になるからです。

```json
{
  "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](/auth.md) でも、`per_channel` を使ってアカウントごとにキャプションを変えるよう、エージェントにはっきり伝えています。

よいバリエーションとは、類義語の置き換えではありません。エージェントは、それぞれのキャプションをそのアカウントに関する事実、たとえば所在地、チーム、オーディエンスに結びつけるべきです。方法の詳細は、言い回しを変えながらブランドのトーンを保つコツも含めて、[AI でアカウントごとにキャプションを変える](/en/blog/caption-variation-per-account-with-ai)で解説しています。

ショート動画の場合は、特にキャプションを短くしましょう。メッセージを伝えるのは動画です。ナレーションを繰り返すだけのキャプションは、スペースの無駄です。

## ショート動画では、リンクをどこに置くのか

エージェントがいちばん間違えやすいのがここです。すべてのネットワークに同じルールを当てはめてしまうからです。

YouTube について、Google はヘルプセンターで、スパムを減らすために[ショートのコメントと説明欄の URL はクリックできない](https://support.google.com/youtube/answer/13748639)と明記しています。ショートの最初のコメントに置いたリード獲得用のリンクは、リンクではなくただの文字列です。Instagram でも、キャプションやコメント内の URL はリンクとして表示されません。最初のコメントのリンクが期待どおりに機能するのは、Facebook ページの投稿です。

そのため、ショート動画を配信するときは、`first_comment` を役に立つチャンネルだけに設定し、ショートでは空にしておくべきです。それでも Shager は `cta_url` からアカウントごとに計測用の短縮リンクを生成するので、リンクが表示される場所ではどこでも、クリックのデータはアカウント別に記録されます。このやり方の全体像は、[エージェントで最初のコメントにリード獲得リンクを置く](/en/blog/first-comment-lead-links-with-agents)にまとめています。

## 間隔の調整：stagger_seconds が実際にしていること

`stagger_seconds` は、同じネットワークのアカウント同士の間に入れるランダムな待ち時間（秒）です。デフォルトは `[30, 90]` です。38のアカウントが3つのネットワークに分かれている場合、各ネットワークのキューは独立して動きます。Instagram のアカウント同士、YouTube のチャンネル同士がそれぞれ間隔を空けて配信されます。

動画の場合、私はたいていこの幅を広げます。38アカウントを `[45, 120]` で配信すると終わるまでに時間はかかりますが、投稿がスクリプトではなく人が公開しているように見える時間幅に分散されます。クライアントが「この時刻までにすべて公開されていること」を重視するなら、間隔を詰めるのではなく、予約時刻を早めるべきです。タイミングについては、[エージェントのための予約戦略](/en/blog/scheduling-strategy-for-agents)で詳しく扱っています。

## 結果の確認

予約時刻を過ぎたら、エージェントは `get_post` を呼びます。投稿全体の状態と、アカウントごとの状態（公開時刻、公開された URL、またはエラー）が返ってきます。投稿のステータスには `PUBLISHED`、`PARTIALLY_PUBLISHED`、`FAILED` などがあり、そのほかは [OpenAPI ドキュメント](https://app.shager.ai/api/v1/openapi.json)に記載されています。

規模が大きくなれば、`PARTIALLY_PUBLISHED` という結果はよくあることです。あるアカウントのトークンが期限切れになっていた、あるページが権限を失っていた、といった具合です。エージェントの仕事は、やみくもにリトライすることではなく、該当するアカウントを名前で人に報告することです。多くの場合、そのアカウントだけに新しいクライアント向け接続リンクを送れば解決します。

## スクリプト向けの REST 版

チャットのエージェントではなくスクリプトからパイプラインを動かす場合、同じ2つのステップを REST で書くと次のようになります。

```bash
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` でどのアカウントがなぜ失敗したのかがわかり、ほかのアカウントへの配信には影響しません。

## 次に読むもの

エージェントをまだ接続していない場合は、[エージェント向けの入口](/en/agents)から始めてください。MCP サーバー、REST API、セルフサインアップについて解説しています。そのうえで、クライアントのアカウント全体に向ける前に、小さなグループでショート動画を1本配信してみましょう。

---
Source: https://shager.ai/ja/blog/agent-short-video-distribution
