mcpField
O
omnisocials

omnisocials

github.com/omnisocialsマーケティング・グロース29119 回インストール1 日前に更新
リポジトリ

omnisocials について

OmniSocials でソーシャルメディアのコンテンツを管理するスキルです。アカウント設定から投稿の作成、予約、公開、分析まで扱い、11 のプラットフォームに対応します。重要な操作には明示的な確認を求めます。

主な機能

  1. 01ソーシャル投稿の作成と予約
  2. 0211 のプラットフォームへの公開
  3. 03投稿分析の確認
  4. 04受信メッセージとコメントの管理
  5. 05メディアとハッシュタグセットの整理

活用シーン

  1. 01接続済みチャネルへの投稿計画
  2. 02予約投稿とパフォーマンスの確認
  3. 03受信コメントやメッセージへの対応
  4. 04プラットフォーム別投稿用メディアの準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/omnisocials/omnisocials-agent-skills --skill omnisocials

インストール後、Claude Code で/omnisocialsを入力して読み込まれたか確認します。

同梱ファイルCHANGELOG.mdscripts/omnisocials.js

詳細

OmniSocials スキル

OmniSocials を使って、11 のプラットフォームでソーシャルメディアコンテンツを作成、予約、公開します。

OmniSocials は、Instagram、Facebook、LinkedIn(個人プロフィールと企業ページ)、YouTube、TikTok、X(Twitter)、Pinterest、Bluesky、Threads、Mastodon、Google Business にわたって、投稿の予約や分析の追跡ができるソーシャルメディア管理ツールです。

LinkedIn には 2 つのチャンネル ID があります: linkedin は個人プロフィール、linkedin_page は企業ページです。両方を 1 つのワークスペースに接続して、それぞれ独立して投稿できます。ユーザーがどのアカウントを接続しているか、必ず accounts:list で確認してください。

セットアップ

このスキルを使用する前に、以下を確認してください。

  1. API キー:セットアップコマンドを実行して、API キーを安全に設定します

    • キーは https://app.omnisocials.com/settings/api で取得します
    • 実行:<skill-path>/scripts/omnisocials.js setup
    • または、環境変数を設定します:export OMNISOCIALS_API_KEY=omsk_live_your_key
  2. 要件:Node.js 18 以降(組み込みの fetch API 用)。その他の依存関係は不要です。

設定の優先順位(高い順):

  1. OMNISOCIALS_API_KEY 環境変数
  2. ./.omnisocials/config.json(プロジェクトローカル、ユーザーの作業ディレクトリ内)
  3. ~/.config/omnisocials/config.json(ユーザーグローバル)
「API key not found」エラーへの対応

重要:CLI から「API key not found」エラーを受け取った場合は、以下に従ってください。

  1. セットアップコマンドを実行するようユーザーに伝えてください。セットアップは対話形式でユーザーの入力が必要なため、ユーザーに代わって実行することはできません。
  2. そこで停止して待機してください。タスクを続行しないでください。ユーザーがセットアップを完了し、確認するまで待ってください。

注:このドキュメントに記載されているすべてのスクリプトパスは、この SKILL.md ファイルがあるスキルディレクトリからの相対パスです。スキルのインストール先に応じて解決してください。

安全ルール

重要:常に以下のルールに従ってください。

  1. ユーザーの明示的な確認なしに投稿を公開してはいけません。 下書きの作成は安全ですが、公開は取り消せず、すぐに公開されます。
  2. ユーザーの明示的な確認なしに投稿、メディア、ウェブフックを削除してはいけません。
  3. 投稿を作成する前に、必ず最初にアカウントを一覧表示し、有効なチャンネル ID を取得してください。チャンネル ID を推測してはいけません。
  4. 投稿を作成する前に、必ずメディアの要件を確認してください。
    • ストーリーズ:画像または動画が必ず必要です。ストーリーには1~10個のメディア項目を指定できます。各項目が1枚のスライドとなり、指定された順に Instagram/Facebook でそれぞれ独立したストーリーとして公開されます(10個を超えると400エラーが返されます)。ストーリー動画は1スライドあたり最大60秒です。どのメディアをどの順序で使うか、ユーザーに確認してください。
    • リール:動画が必ず必要です。
    • Instagram の投稿:画像または動画が少なくとも1つ必ず必要です。
    • TikTok の投稿:画像または動画が少なくとも1つ必ず必要です。
    • Pinterest の投稿:画像と --pinterest-board-id が必ず必要です。
    • その他のプラットフォーム(LinkedIn Profile、LinkedIn Page、X、Facebook の投稿、Bluesky、Threads、Mastodon、Google Business):メディアは任意です。
    • プラットフォームごとのメディア上限(上限を超えると、正確な上限を示す 400 validation_error が返されます):最大項目数 — X/Bluesky/Mastodon は4以下、Instagram/Threads は10以下、TikTok の写真は35枚以下です。スレッドの各パートにも同じ上限が適用されます(X/Bluesky/Mastodon は各パート4項目、Threads は各パート10項目)。1つの投稿に画像と動画を混在させる場合:Instagram/Threads では可能です(画像と動画を混在させたカルーセル)。Facebook/LinkedIn/LinkedIn Page/X/Bluesky/Mastodon/TikTok では拒否されます(画像のみ、または動画1本のみ)。動画の長さ/サイズ — X は無料/Basic アカウントで140秒(2分20秒)/512MB、接続済みの X アカウントが Premium または Premium+ の場合は125分/16GB(接続状況からプランが自動検出されます。アップグレード後に X を再接続してください)、Bluesky は180秒、Threads は5分、Instagram は15分、TikTok は10分、YouTube Short は3分です。ユーザーの動画が上限を超えている場合は、トリミングできるよう上限を伝えてください。
    • フィード画像のアスペクト比(Instagram、Pinterest):Instagram ではフィード画像は4:5から1.91:1までの範囲で表示されます。それより縦長の画像(スマートフォンで撮影した9:16の写真など)は、中央部分を目視せずに4:5へトリミングされます。Meta では、この範囲外のフィード投稿を宣伝できません。デフォルトでは OmniSocials が Instagram チャンネル向けにのみ、被写体を中心にそのような画像を4:5(縦長)または1.91:1(横長)にトリミングし、その旨を報告します。Pinterest では2:3より縦長のピンをそのまま保持し、ホームフィードで切り取られる可能性があることを報告します。ストーリーズ、リール、TikTok の写真と動画はトリミングされません。縦長(9:16)の画像を Instagram に投稿する前に、media:check --media-id <id> を実行してください(ライブラリ内の画像のみ。チャンネルで画像が切り取られる場合は Image fit ブロックが表示されます)。Instagram で画像が範囲に収まらない場合、ユーザーに必ず確認してください:「4:5にトリミングしますか(推奨。Meta で投稿を宣伝できます)、それとも元の画像を維持しますか(Instagram が自動で切り取ります。宣伝はできません)?」回答を --media-fit instagram=crop または --media-fit instagram=keep として渡してください(Pinterest の場合:pinterest=crop で2:3にトリミングします)。ユーザーが希望を示していない場合は、デフォルトの処理を実行し、投稿作成後に CLI が出力する [image_fit] の警告を伝えてください。何がどのサイズにトリミングされたか、また posts:update <id> --media-fit instagram=keep で元の画像に戻せることを伝えます。画像のアスペクト比を理由に投稿からチャンネルを除外してはいけません。いずれの場合も投稿は公開されます。
    • Pinterest のボード — 最初のボードを自動選択:ユーザーが Pinterest への投稿を希望しているものの、ボードを指定していない場合、確認の質問で止めたり、Pinterest をスキップしたりしてはいけません。accounts:get <pinterest_account_id> を実行してください。出力には各ボードの名前と ID が表示されます。最初のボードを自動的に使用してください。投稿を作成した後、使用したボードをユーザーに伝えてください(例:「Pinterest の「Marketing」ボードに投稿しました。別のボードをご希望でしたらお知らせください。移動します。」)。ユーザーが依頼時に特定のボードを指定している場合は、一覧と大文字小文字を区別せずに照合し、そのボードを使用してください。
  5. 明示的に依頼された場合を除き、投稿間でコンテンツを重複させてはいけません。
  6. 投稿を予約する際は、必ずタイムゾーンと日時をユーザーに確認してください。
  7. 一括操作では、1つずつ処理し、各操作の間に確認を取ってください。
  8. レビュー中の投稿について報告または変更を行う前に、承認レビューを読んでください。投稿の approval_status: "rejected" または "pending"(投稿の status が rejected または in_approval)の場合は、まず posts:approval <id> を実行してください。そこには決定者、理由、レビュアーのコメントが記載されています。投稿が却下された理由や、誰の確認待ちなのかを推測してはいけません。また、レビュー内容を読み、そこに書かれている内容をユーザーに伝える前に、投稿を編集、再予約、再作成してはいけません。
  9. コメントから DM を送信する自動化は、アカウント名義で DM を送信します。作成する前に(automations:create、または投稿の --dm-keywords/--dm-message)、DM の正確な文面とキーワードをユーザーに提示し、確認を取ってください。キーワードをコメントした人全員に1回ずつ DM が送信され、送信済みの DM は取り消せません。ユーザーがすべてのコメントへの返信を依頼した場合を除き、--match any(または --dm-match any)を使用してはいけません。これはすべてのコメントに返信します。Automations のスコープは API キーでオプトインします。403 insufficient_scope は、リクエストが誤っていたという意味ではなく、ユーザーが Settings > API でそのキーの Automations を有効にする必要があることを示します。

Common Actions

ユーザーの発言…アクション
"Instagramに投稿して"accounts:list でInstagramのチャンネルIDを確認し、その後 posts:create --text "..." --channels <id>
"明日の投稿を予約して"posts:create --text "..." --channels <ids> --schedule "2026-04-07T09:00:00Z"
"時間を提案して、まず確認させて"posts:create --text "..." --channels <ids> --schedule "2026-04-07T09:00:00Z" --draft。予約済みの下書きは、その時刻にカレンダー上に破線の枠で表示され、誰かが予約するまで公開されません。ユーザーが同意したら、posts:update <id> --no-draft
"予約済みの投稿を表示して"posts:list --status scheduled
"この画像をアップロードして"media:upload --url "https://..."(ローカルファイルの場合は media:upload-base64 --file ./img.jpg)
"TikTok用のリールを作成して"posts:create --text "..." --channels <tiktok_id> --type reel --media-urls "https://video.mp4"
"すべてのプラットフォームに投稿して"accounts:list を実行し、その後 posts:create --text "..." --channels <all_ids>
"Xにスレッドを投稿して"`posts:create --channels <x_id> --x-thread "part 1
"Blueskyにスレッドを投稿して"`posts:create --channels <bluesky_id> --bluesky-thread "part 1
"Mastodonにスレッドを投稿して"`posts:create --channels <mastodon_id> --mastodon-thread "part 1
"Threadsにスレッドを投稿して"`posts:create --channels <threads_id> --threads-thread "part 1
"Instagramで位置情報をタグ付けして"locations:search "<place name>" を実行し、その後 posts:create ... --location-id <id>
"Threadsで位置情報をタグ付けして"locations:search "<place name>" --platform threads を実行し、その後 posts:create ... --threads-location-id <id>(順次提供中)
"PinterestのPinに商品をタグ付けして"pinterest:products でアカウントの商品Pinを一覧表示し、その後 posts:create ... --pinterest-board-id <id> --pinterest-product-tags <pin_id,pin_id>(最大24件、自分の商品Pinのみ。Pinterestが拒否した商品があっても投稿は失敗しません)
"音楽付きのリールを投稿して"audio:search "<song or artist>"(クエリなしの場合はトレンドを検索)を実行し、その後 posts:create ... --type reel --instagram-audio-id <id>
"この縦長(9:16)の写真をInstagramに投稿して"media:check --media-id <id> を実行します。Image fit ブロックにInstagramで切り抜かれると表示されたら、「4:5に切り抜きますか、それとも元のままにしますか?」と尋ね、その後 posts:create ... --media-ids <id> --media-fit instagram=crop または instagram=keep を実行します。CLIが表示する [image_fit] 警告をユーザーに伝えてください
"投稿の反応はどう?"analytics:overview --period 7d、または複数の投稿をまとめて確認する場合は analytics:posts <id,id,...>
"新しいDMやコメントはある?"inbox:list --unread(絞り込むには --platform/--type dm|comment|mention を追加します。返信待ちのものだけを表示するには --unanswered を指定します)。inbox:read スコープが必要です
"返信が必要なものを順に処理して"/"受信トレイに返信して"inbox:next ループを使います。inbox:next は、次に返信が必要な項目を、そのスレッド、対象の投稿、reply_window とともに返します(まず返信可能なDM、次に24時間の返信可能時間が終了したInstagram/FacebookのDM、その後に古い順でコメントとメンション)。それをもとに返信を下書きし、inbox:reply <conversation-id> --text "..." --next で送信します。応答には次の項目も含まれます。コメントまたはメンションには、返信が該当するユーザーのコメントに付くよう、必ず --message-id <message-id>(「Message to answer」のID)を追加してください。reply_window.open が false の場合、API経由ではDMに返信できません。Instagram/Facebookアプリで返信するようユーザーに伝えるか、inbox:read でスキップしてください。項目を今後もスキップするには inbox:read <conversation-id> を、今回の呼び出しだけスキップするには --exclude <conversation-id> を使います。「Nothing is waiting for an answer.」と表示されると停止します。返信には inbox:read(および inbox:write)スコープが必要です
"そのメッセージに返信して"inbox:messages <conversation-id> でスレッドを読み、その後 inbox:reply <conversation-id> --text "..."。コメントまたはメンションには --message-id <message-id>(返信対象のコメントのID。inbox:messages または inbox:next から取得)を追加してください。投稿上のすべてのコメントは1つの会話を共有しており、この指定がないと最新のコメント(別のユーザーのコメントである可能性があります)に返信が付きます。inbox:write が必要です
"その会話を既読にして"inbox:read <conversation-id>。inbox:write が必要です
"そのコメントを非表示にして"inbox:hide <message-id>(inbox:messages または inbox:next から取得したメッセージID。Facebook、Instagram、TikTok、YouTube、Threadsに対応。--unhide で元に戻せます。inbox:write が必要です)
"そのコメントを削除して"inbox:delete <message-id>(Facebook、Instagram、TikTokのコメントに対応。取り消せないため、まずユーザーに確認してください。YouTubeでは inbox:hide を使います。inbox:write が必要です)
"メディアを整理して"folders:list/folders:create --name "..." を実行し、その後 --folder-id <id> を付けてアップロードします
"いつものハッシュタグを追加して"hashtag-sets:list でセットを確認し、その後 posts:create ... --hashtag-set "<name>"(キャプションにタグを含めない場合は --hashtag-placement first_comment を追加します)
"これらのハッシュタグを再利用できるように保存して"hashtag-sets:create --name "Brand" --tags "#a #b #c"
"この投稿にキーワードをコメントした人全員にDMを送って"まずDMの文面とキーワードをユーザーに確認してください(安全ルール9)。新しい投稿では、posts:create ... --channels <instagram_id> --dm-keywords "guide" --dm-message "Here is the guide: https://..." を使います(コメントの下に公開返信を追加するには --dm-reply "Sent you a DM!" を指定します)。既存の投稿では、posts:list でIDを確認し、その後 automations:create --post-id <id> --keywords "guide" --dm "..." を実行します。OmniSocials以外で公開した投稿には、代わりに --instagram-media-id <id> を指定します。automations:events <id> で処理結果を確認できます。オプトインの automations:write スコープが必要です(一覧表示と読み取りには automations:read が必要です)
"その投稿を削除して"ユーザーに確認してから posts:delete <id>
"下書きを公開して"ユーザーに確認してから posts:publish <id>
"失敗した投稿を再試行して"posts:list --status failed で投稿を確認し、その後 posts:retry <id> を実行します(失敗したプラットフォームのみ再試行されます。結果は posts:get で確認してください)。注:posts:publish は失敗した投稿を受け付けません。正しいコマンドは再試行です
"保留中の投稿を承認/却下して"posts:list --status in_approval で投稿を確認し、posts:approval <id> でレビュアーのコメントを読み、その後 posts:approve <id> または posts:reject <id> --comment "..." を実行します。接続中のユーザーが投稿の現在のワークフローステップで承認者として登録されている場合のみ機能します(それ以外は forbidden を返します)
"投稿が却下された理由は?"/"レビュアーは何と言っていた?"posts:list --status rejected で投稿を確認し、その後 posts:approval <id> を実行します。却下した人、却下されたステップ、理由、コメントのスレッドが表示されます。変更を加える前に、その内容をユーザーに伝えてください。却下された投稿は公開されません。ユーザーはダッシュボードの投稿画面にある「Edit & Resubmit」で編集して再送信できます。またはユーザーの同意を得て、posts:create ... --approval-workflow <id> で修正した投稿を作成できます
"投稿は誰の承認待ち?"/"なぜまだ公開されていないの?"posts:approval <id> を実行します。「Waiting on」の行に現在のステップと、まだ判断が必要な承認者が表示されます。予定時刻を過ぎても in_approval のままの投稿は公開されません。遅れて承認されると、すぐに公開されます
"公開前に投稿を確認したい"/"承認に回して"approval-workflows:list でワークフローIDを確認し、その後 posts:create ... --schedule <ISO8601> --approval-workflow <id> を実行します。投稿は in_approval になり、承認者に通知されます。最後のステップで承認されると、予定時刻に公開されます(ダッシュボードの「Approvals」ページ、または posts:approve を使用)。ワークフローがない場合は、ダッシュボードの「Approvals」で作成するようユーザーに伝えてください
"Webhookを設定して"webhooks:create --url "https://..." --events post.published,post.failed
"投稿が承認または却下されたときにシステムに通知して"webhooks:create --url "https://..." --events post.approved,post.rejected

ワークフロー

投稿を作成する際は、次のワークフローに従ってください。

  1. アカウントを一覧表示して、利用可能なチャンネル ID を確認します。

    ./scripts/omnisocials.js accounts:list
    
  2. 必要に応じてメディアをアップロードします(ストーリー、リール、Instagram、TikTok、Pinterest では必須です)。

    ./scripts/omnisocials.js media:upload --url "https://example.com/image.jpg"
    

    返された media_id を控えておきます。

  3. 適切なチャンネル、メディア、プラットフォームオプションを指定して、投稿を作成します。

    ./scripts/omnisocials.js posts:create --text "..." --channels <id1>,<id2> --media-ids <media_id>
    
  4. 必要に応じて予約または公開します。

    • 予約するには、--schedule "2026-04-10T14:00:00Z" を追加します。
    • --schedule の横に --draft を追加すると、担当者の確認を前提とした予定下書きとして指定できます(posts:update <id> --no-draft で予約されます)。
    • すぐに公開するには、posts:create-and-publish を使用します。
    • または、まず下書きとして作成し、確認後に posts:publish <id> を実行します。

コマンドリファレンス

セットアップと設定
コマンド説明
setup対話形式でセットアップします。API キーの入力を求め、検証して保存します。
setup --api-key <key> --globalグローバル設定に対話なしでセットアップします。
config:show現在の設定と API キーの取得元を表示します。
投稿
コマンド説明
posts:list投稿を一覧表示します。フラグ:--status draft|in_approval|scheduled|posting|published|failed|warning|rejected(in_approval = 承認ワークフローでレビュー担当者の確認待ち、rejected = 承認者が却下。どちらの場合も、posts:approval <id> を示す Approval: 行が表示されます)、--limit、--offset
posts:get <id>投稿の詳細をすべて取得します
posts:recent-platform接続済みプラットフォームの API から、OmniSocials 外で公開されたものも含め、最近の投稿をリアルタイムで取得します。posts:list が空の場合(ワークスペースを新規作成したばかりの場合)に使用します。各投稿について、プラットフォーム固有の id(投稿を保存する際の安定した重複排除キー)、permalink、キャプション全文、形式、タイムスタンプ、正規化されたエンゲージメント、プラットフォームが公開する生の指標すべてを正確な整数値で返します(Instagram では投稿ごとのインサイトからリーチ/再生数/保存数/シェア数を取得します。ワークスペースで TikTok のコメントが有効な場合、TikTok では average_time_watched/full_video_watched_rate/total_time_watched/favorites/reach を取得します)。レコードには duration_seconds(整数、null 可)も含まれます。プラットフォームの一覧 API が報告する動画の長さを秒単位の整数で示します。現在は TikTok と YouTube が対象です。画像や、長さを公開していないプラットフォームでは null になります(Instagram のメディア API には長さのフィールドがありません)。キャプション全文(省略なし)、正確な指標、ID、パーマリンクを取得するには --json を追加します(人間向けの表では省略・丸めが行われます)。LinkedIn はアプリにその権限を付与しないため、個人プロフィールの投稿をリアルタイムで一覧表示できません。そのため、linkedin の結果には OmniSocials 経由で公開された投稿と、最新の収集済み統計が表示されます。TikTok の写真投稿も同様に補完されます。フラグ:--limit(1~50、デフォルトは 25。X は明示的に設定しない限りデフォルトで 10。API では返却された投稿ごとに課金されます)、--platforms(カンマ区切りのフィルター)。X の結果は最大 24 時間前のスナップショットから取得される場合があります。OmniSocials 経由で X に公開した直後に更新されます。analytics:read スコープが必要です。
posts:create新しい投稿を作成します。フラグ:--text、--channels、--schedule、--draft(--schedule と併用する、計画済みの下書き)、--type post|story|reel、--media-ids、--media-urls、--link-url(および --link-title/--link-description/--link-thumbnail-url)、--location-id、--collaborators、--user-tags、--x-thread、--bluesky-thread、--mastodon-thread、--threads-thread、--threads-location-id、--video-cover-json、--dm-keywords と --dm-message(この投稿に紐づくコメントから DM への自動化。--dm-reply、--dm-match、--dm-max-sends、--dm-stop-at と併用します。--channels に Instagram が必要です。「自動化」を参照)、およびプラットフォーム固有のフラグ
posts:create-and-publish投稿を作成してすぐに公開します。--schedule を除き、posts:create と同じフラグを使用します
posts:update <id>下書きまたは予約済みの投稿を更新します。posts:create と同じフラグを使用します。承認待ち(in_approval)の投稿に --schedule を指定すると、時間のみが変更され、ステータスは変わりません。--no-draft は、すでに設定されている時間に計画済みの下書きを予約します(時間が設定されていない場合、または過去の場合は 400 validation_error が返されます。その場合は新しい --schedule を指定してください)。--draft は予約済みの投稿の予約を解除し、時間は維持します。--dm-* フラグは投稿のコメントから DM への自動化を置き換え、--no-dm は削除します
posts:publish <id>下書きまたは予約済みの投稿を今すぐ公開します。ステータスが failed または warning の投稿は拒否されます。その場合は posts:retry を使用してください
posts:retry <id>失敗した投稿、または一部のプラットフォームで失敗した投稿について、失敗したプラットフォームへの再試行を行います。成功したプラットフォームには再公開されません。非同期で、プラットフォームごとに最大 3 回再試行されます。応答は再試行がキューに入ったことを示します。結果を確認するには posts:get をポーリングしてください。あるプラットフォームで 3 回再試行すると、API は max_retries_reached を返し、投稿を作り直す必要があります。投稿の応答には retry_of(この投稿が再試行する失敗投稿)と retries(この投稿から作成された再試行投稿)が含まれます。published_urls が空で retries が設定された published 投稿は、失敗が解決済みであり、実際の URL は再試行投稿に記載されていることを示します
posts:approve <id>投稿の承認ワークフローの現在のステップを承認します(approval_status: "pending"、投稿の status: "in_approval")。接続ユーザーは現在のステップに指定された承認者である必要があります。ステップは順番に承認されるため、後のステップの承認者が先行するステップの完了前に承認しようとすると forbidden が返されます。最後のステップの場合、投稿はただちに確定されます(scheduled または posting)。それ以外の場合は in_approval のままとなり、次のステップの承認者に通知されます
posts:reject <id>投稿の承認ワークフローを却下します。承認者の要件は posts:approve と同じです。承認とは異なり、現在のステップだけでなくワークフロー全体をただちに停止し、投稿のステータスを rejected にします。フラグ:--comment "..."(任意。依頼者と他の承認者に表示されます)
posts:approval <id>承認ワークフローを経た投稿のレビュー内容を読み取ります(読み取り専用、posts:read)。レビューの status(none、pending、approved、rejected)、ワークフロー、依頼者、承認待ちのステップと、まだ判断が必要な承認者、却下した人とその理由、各ステップの承認者ごとの判断、古い順のコメントスレッドを表示します([instagram]、[linkedin_page] などのタグが付いたコメントは、そのチャンネルのみを対象とします。スレッドには、レビュー担当者が投稿を編集したときに OmniSocials が書き込む項目も含まれます)。--json は、post_id、status、workflow、requested_by、requested_at、current_step、steps[](order、name、require_mode、status、id、name、email、status、decided_at、comment を含む approvers[])、rejection(by、reason、at、step)、comments[](id、author、message、account、created_at)を含む完全なオブジェクトを返します。ワークフローのない投稿では、steps と comments が空の status: "none" が返されます。このワークスペースに投稿がない場合は 404 not_found が返されます。投稿の approval_status が rejected または pending の場合は、ユーザーに伝えたり投稿を編集したりする前に必ずこのコマンドを実行してください
approval-workflows:listこのワークスペースで使用できる承認ワークフロー(ID、名前、承認者名付きのステップ。workspace_id が null の場合は会社全体が対象)を一覧表示します。ワークフローはダッシュボード(「承認」)で作成します。ID を posts:create --approval-workflow <id> に渡すと(--schedule が必要で、--publish-now とは併用できません)、投稿は in_approval として作成されて承認者に通知され、最後のステップで承認されると予約時刻に公開されます。エラー:404 workflow_not_found、400 validation_error(--schedule がない、またはステップ 1 に承認者がいない場合)
posts:delete <id>OmniSocials から投稿を削除します(元に戻せません)。プラットフォーム上の公開済み投稿は削除されません
メディア
コマンド説明
media:listアップロード済みのメディアファイルを一覧表示します。フラグ:--limit、--offset
media:uploadURL からメディア(画像、動画、または PDF)をアップロードします。フラグ:--url(必須)、--filename、--name(検索可能なラベル)、--folder、--folder-id、--pdf-mode
media:upload-base64ローカルファイルまたは base64 データ(画像、動画、または PDF)をアップロードします。フラグ:--file <path>(自動的にエンコードし、.pdf を含めて MIME タイプを推測)または --data と --mime-type。さらに、--filename、--name(検索可能なラベル)、--folder、--folder-id、--pdf-mode
--pdf-modePDF のアップロードのみが対象です。slides(デフォルト):ページごとに画像メディアアイテムを 1 つ作成し、それぞれに ID が付与されます。すべてを posts:create --media-ids に渡してください。document:PDF 全体を 1 つのメディアアイテム(type: document、ページは pdf.pages に格納)として扱います。単一の ID を --media-ids に渡すと、投稿にすべてのページが順番に含まれます。どちらのモードでも元のファイルは保持され、LinkedIn に送信されます。デッキをライブラリ内の 1 つのアイテムにしたい場合は、document をおすすめします。media:list --json では、ドキュメントアイテムは type: "document" と表示されます
PDF カルーセルPDF をアップロードすると、ページごとに画像スライド 1 枚に分割されます(最大 20 枚)。レスポンスには各スライドのメディア ID が含まれます。すべてを posts:create --media-ids に渡すと、デッキをカルーセルとして投稿できます。元のファイルは保持されます(レスポンスには pdf.id、pdf.name、pdf.url が含まれ、各スライドには pdf: { id, page, total_pages, ... } が含まれます)。スライドを変更せず順番どおりに投稿すると、LinkedIn では元の PDF から作成された、スワイプ可能なネイティブのドキュメントとして投稿されます(テキストの鮮明さが保たれ、ドキュメント内のリンクが機能し、閲覧者は実際のファイルをダウンロードでき、20 枚の上限を超えてもすべてのページが含まれます)。Instagram、TikTok、Threads、Pinterest では画像カルーセルとして投稿されます。既存のデッキ(Canva/PowerPoint/Figma から PDF に書き出したもの)を、スライドごとに手作業で書き出さずに投稿できます。
media:check投稿前に、メディアが対象プラットフォームに適合するか確認します。フラグ:--url、または --media-id、または --size-bytes と --mime。ライブラリ内の画像(--media-id)の場合、レスポンスには file.width/file.height と fit[] も含まれ、Image fit ブロックとして表示されます。このブロックでは、Instagram と Pinterest のフィード投稿での表示方法(アスペクト比、適合するかどうか、トリミング対象、デフォルトの動作:Instagram は crop、Pinterest は keep)と、これを上書きする --media-fit の値を確認できます。動画と --url のチェックには fit の行はありません。Instagram に縦長の画像を投稿する前に確認してください(安全ルール、ルール 4)
media:delete <id>メディアファイルを削除します
フォルダー
コマンド説明
folders:listメディアフォルダー(ID、名前、親フォルダー、アイテム数)を一覧表示します。フォルダー ID は media:upload-base64 --folder-id で使用します。
folders:createフォルダーを作成します。フラグ:--name(必須)、--parent-id(別のフォルダーの下に作成)
ハッシュタグセット

ワークスペースごとに保存できる、再利用可能なハッシュタグのグループです。投稿の作成時に posts:create --hashtag-set "<name>" を使って適用すると、タグがキャプションに一度だけ追加されます(投稿にはプレーンテキストが保存されるため、後からセットを編集しても既存の投稿は変わりません)。キャプションにすでに含まれているタグはスキップされます。Instagram のハッシュタグ上限である30個を超えると、hashtag_limit_exceeded で即座に失敗します。代わりに --hashtag-placement first_comment を追加すると、Instagram/Facebook/LinkedIn/LinkedIn Page/YouTube ではタグが自動で最初のコメントとして投稿されます(その他のチャネルではキャプションに追加されます)。また、--hashtag-platforms instagram,tiktok を追加すると、投稿先チャネルの一部にのみタグを付けられます。

コマンド説明
hashtag-sets:list保存済みのセットを一覧表示します(ID、名前、タグ数、プレビュー)。
hashtag-sets:createセットを保存します。フラグ:--name(必須、ワークスペース内で一意)、--tags(必須、例:"#fitness #gym workout" — # は省略可、大文字と小文字を区別せず重複を除外、最大100個)
hashtag-sets:update <id>名前の変更やタグの置き換えを行います。--tags はタグのリスト全体を置き換えます — 新しいリスト全体を指定してください。
hashtag-sets:delete <id>セットを削除します。すでにそのセットを使用した投稿のハッシュタグは残ります。
オートメーション(コメントからDMへ)

オートメーションは、Instagramのコメントに含まれるキーワードに対して、1人につき1回、DMで返信します。オプションで、コメントの下に公開返信(「DMを送りました!」)を付けることもできます。DM内またはストーリーズへの返信に含まれるキーワードにも返信できます(--triggers dm,story_reply)。対象は、1つの投稿(Instagramに投稿されるOmniSocialsの投稿。予約済みまたは公開済み。--post-idを指定)またはOmniSocials以外で公開された投稿(--instagram-media-idを指定)、ワークスペースが次に公開するInstagram投稿(--scope next_post)、またはすべての投稿(--scope any)です。1つの投稿につきオートメーションは1つです。Instagramでは、7日以内に各コメントへ非公開返信を1回送信できます。OmniSocialsは1アカウントにつき1時間に最大180件のDMを送信します。APIキーでは、スコープをオプトインで有効にします。automations:read(一覧表示、取得、イベント)とautomations:write(作成、更新、削除、および投稿での--dm-*フラグ)が必要です。これらがない場合、APIは403 insufficient_scopeを返し、CLIは有効化する場所(Settings > API)を案内します。安全ルール9に従い、作成する前にDMのテキストとキーワードをユーザーに確認してください。

コマンド説明
automations:listオートメーションを一覧表示します。ID、ステータス(active、paused、completed=上限に到達)、名前、トリガー、キャプションまたはリンク付きの投稿、統計情報(送信済み/一致/スキップ/失敗)を表示します。フラグ:--status active|paused|completed、--post-id <id>
automations:get <id>詳細をすべて表示します。トリガー、投稿、DMのテキスト、公開返信のバリエーション、上限、統計情報、日付
automations:createオートメーションを作成します。フラグ:--dm "<text>"(必須、最大1000文字)、--keywords "guide,link"(最大20個。--match anyを指定しない場合は必須)、--post-id <id>または--instagram-media-id <id>(投稿へのコメントをトリガーにする場合、いずれか1つが必須)、--reply "<text>"(コメントの下に表示する公開返信。フラグを繰り返すか、カンマ区切りのリストを渡すと最大10個のバリエーションを順番に使用します。返信文にカンマを含める場合は、独立したフラグで指定してください)、--match word|contains|any(デフォルトはword=単語全体。anyはすべてのコメントに返信)、--scope post|next_post|any(デフォルトはpost)、--triggers comment,dm,story_reply(デフォルトはcomment。公開返信が適用されるのはコメントのみ)、--max-sends <n>、--stop-at <ISO8601>、--name "..."、--paused(オフの状態で作成)。APIを呼び出す前に、--dmの指定漏れ、両方の投稿フラグの同時指定、投稿を指定していない投稿へのコメントトリガーをCLIが拒否します。エラー:400 post_required、400 post_not_instagram、404 post_not_found、404 instagram_media_not_found、409 instagram_not_connected、409 instagram_needs_reauth、409 automation_exists(CLIは既存のオートメーション名を表示します)
automations:update <id>渡した内容のみを変更し、それ以外は保存済みの値を維持します(新しい--keywordsを指定しても、トリガー、スコープ、マッチ条件は維持されます。新しい--dmを指定しても、公開返信は維持されます。--stop-atを指定しても、--max-sendsは維持されます)。automations:createと同じフラグに加え、--pauseと--resumeを指定できます。--keywordsには新しいキーワードのリスト全体を指定します。別の--post-id/--instagram-media-idを指定すると、オートメーションの対象がその投稿に移ります。上限またはトリガーを変更すると、completed状態のオートメーションは再開します
automations:delete <id>オートメーションを削除します。事前にユーザーの確認を取ってください。すでに送信されたDMはそのまま残ります
automations:events <id>アクティビティを表示します。まず集計行(オートメーション全体の送信済み、スキップ、失敗、保留中)を表示し、続いて各イベントについて、時刻、種類(コメント、DM、ストーリーズへの返信)、結果とその理由(already_sent、limit_reached、stopped、window_passed、rate_limited、またはプラットフォームのエラーテキスト)、相手、相手が書いた内容(コメント。DMまたはストーリーズへの返信は、キーにinbox:readも含まれる場合のみ)、送信したDMを1行ずつ表示します。フラグ:--outcome sent|skipped|failed|pending、--limit <1-100>(デフォルトは25)、--offset
ロケーション
コマンド説明
locations:search "<name>"タグ付け可能なロケーションを検索します(最低 2 文字)。デフォルトの --platform instagram は Facebook Places を検索し、posts:create --location-id 用の location_id 値を返します。--platform threads は Threads のロケーションを検索し、posts:create --threads-location-id 用の id を返します。名前の代わりに --latitude + --longitude も受け付けます。この 2 つの id 名前空間は異なります。Instagram の location_id を Threads のものとして渡したり、その逆をしたりしないでください。Threads のロケーション検索は段階的に展開中です。Meta が権限を承認するまでは API が not_available を返し、古い Threads 接続では再接続するまで threads_reauth_required を返します。
Pinterest の商品

商品タグは Pin に商品を配置するもので、画像内のアイテムを購入できるようになります。タグとは、接続されている Pinterest アカウントの商品 Pin の Pin ID です。Pinterest が商品を受け入れるのは、その Pin が公開されており、同じ Pinterest アカウントに属し、そのアカウントが所有権を主張したウェブサイトにリンクしている場合のみです。他のマーチャントの商品はタグ付けできません。Pin ID を posts:create --pinterest-product-tags に渡します(1 つの Pin につき最大 24 個)。どちらのコマンドも posts:read スコープが必要です。

コマンド説明
pinterest:products接続されている Pinterest アカウントの商品 Pin を一覧表示します。各行は --pinterest-product-tags が受け取る pin_id で始まります。フラグ: --source catalog|pins、--product-group-id <id>、--bookmark <bookmark>、--page-size <1-100>(デフォルト 25、catalog のみ)。--source catalog は Pinterest カタログを読み取ります。行には価格、通貨、在庫状況、マーチャントのアイテム id が含まれ、出力には商品グループが一覧表示されるので、--product-group-id で別のグループを選択できます。これには Pinterest 接続でのカタログアクセスが必要で、ユーザーが OmniSocials コンポーザー(Pinterest オプション、商品を追加、カタログを接続)で一度だけ許可します。--source pins はアカウント自身の Pin を読み取り、Pinterest が商品 Pin としてマークしたものを返します。これはすべての接続で機能します。--source を指定しない場合、API は接続にカタログアクセスがあれば catalog を、なければ pins を使用します。pins の 1 回の呼び出しで最大 250 個の Pin をスキャンするため、「No product Pins in this batch」と --bookmark の値が一緒に出力されることがあります。その場合は bookmark が出力されなくなるまで、その bookmark を指定して再度実行してください。問題は空のリストとしてではなく、Error [code]: message として出力されます: pinterest_not_connected(ワークスペースに Pinterest アカウントがない)、pinterest_catalog_access_required(カタログアクセスなしで --source catalog を指定: ユーザーにカタログの接続を依頼するか、--source pins を使用してください)、platform_error(Pinterest が応答しなかったか拒否しました。メッセージには Pinterest のテキストが含まれます)、validation_error(--product-group-id がアカウントの商品グループではありません)。--json は products[](pin_id、title、description、link、image_url、price、currency、availability、item_id。最後の 4 つは catalog のみ)、bookmark、source、catalog_access を返し、catalog ソースの場合はさらに product_groups[] と product_group_id を返します
pinterest:validate <pin-id-or-link>タグ付けする前に 1 つの Pin を確認します。Pin ID または Pin リンク(https://www.pinterest.com/pin/<id>/。pin.it の短縮リンクは機能しません)を受け取ります。接続されているアカウントの商品 Pin であれば Valid product Pin: <pin_id> を、商品 Pin でないか別のアカウントに属するか存在しない Pin であれば Not valid (<pin_id>): <reason> を、確認を実行できなかった場合(Pinterest アカウントがない、Pinterest が応答しなかった、または Pinterest がその Pin が商品 Pin かどうかを示さなかった)は Not checked (<pin_id>): <reason> を出力します。その場合、公開ステップが最終的な確認となります。この確認は所有権を主張したウェブサイトのルールを考慮しません。Pinterest は公開時にそれを適用します。--json は valid、pin_id、title、link、image_url、unverified、reason を返します
オーディオ (Instagram リールの音楽)
コマンド説明
audio:search ["<song/artist>"]Instagram リール向けに Meta のライセンス済み音楽カタログを検索します。クエリなしの場合は現在トレンドのオーディオを対象とし、--type original_sound でオリジナルサウンドを検索します。posts:create --instagram-audio-id で使用する audio_id の値を返します。サードパーティへの公開がライセンスされたトラックのみが表示されます (選択内容は IG アプリと異なる場合があります)。Instagram アカウントをリンクしたページを持つ Facebook アカウントの接続が必要です。
アカウント
コマンド説明
accounts:list接続されているすべてのソーシャルメディアアカウントを、チャンネル ID、プラットフォーム、コンテンツタイプ、Pinterest ボードとともに一覧表示します
accounts:get <id>プラットフォーム固有の情報を含む完全なアカウント詳細を取得します
アナリティクス
コマンド説明
analytics:post <post-id>投稿のアナリティクスを取得します: インプレッション、リーチ、エンゲージメント、いいね、コメント、シェア、保存、クリック、プラットフォーム別の統計 (X/Bluesky/Mastodon/Threads のスレッド投稿は各部分を合算した値。率と平均は平均値)。プラットフォームごとに、生の metrics はそのプラットフォームが報告するすべての項目を含みます: link_clicks、profile_visits、follows (投稿から得られたフォロワー数)、タイプ別のリアクション、動画関連キー (video_views、avg_watch_time、total_watch_time、watch_time_percentage、completion_rate、skip_rate、replays、engaged_views)、YouTube の traffic_sources、TikTok の impression_sources/audience_types、Pinterest の pin_clicks/outbound_clicks、Instagram ストーリーのナビゲーションと完了率。プラットフォームが測定できない項目 (Google Business の投稿、削除された動画) は、ゼロではなく metrics_unavailable: true と note を持ちます。reach は X、Pinterest、YouTube、Threads、Bluesky、Mastodon、Facebook では存在せず、0 になることもありません (Meta は 2026 年 6 月に Facebook 投稿のリーチを廃止しました。その代替指標はデータを返しません): リーチはそれを提供するプラットフォームのみで合算してください。
analytics:best-times1 つのプラットフォームに対する推奨投稿時間帯 (曜日 + 時間) を、ワークスペース自身の投稿履歴 (直近重視、外れ値抑制、アカウントのタイムゾーン) から計算し、プラットフォームが提供する場合はオーディエンスがオンラインになる時間帯と組み合わせます (Instagram、TikTok Business。basis: own_data_and_audience、レスポンスには audience_online が含まれます)。上位 3 つの時間帯 + 曜日ごとのスコア。分析対象の投稿が 15 件未満の場合は、オーディエンスのオンラインプロファイルのみを使用するか (basis: audience)、明確にラベル付けされた業界デフォルトを posts_needed とともに返します — その旨をユーザーに伝えてください。時間が指定されていない場合のスケジュール設定前に使用します。フラグ: --platform (必須)、--timezone (IANA による上書き)。analytics:read が必要です。
analytics:posts <id,id,...>1 回の呼び出しで最大 100 件の投稿のアナリティクスを取得します (一括)。レート制限を避けるため、analytics:post をループさせる代わりにこれを使用してください。
analytics:overviewワークスペースのアナリティクス概要。フラグ: --period 7d|30d|90d、--start-date YYYY-MM-DD、--end-date YYYY-MM-DD
analytics:accountsアカウントレベルのアナリティクス: フォロワー、フォロー中、投稿数、およびプラットフォームがスナップショット日に報告する日次値 (インプレッション/表示回数、リーチ、エンゲージメント、profile_views、link_clicks、follows_gained、follows_lost。Google Business の calls、direction_requests、website_clicks、average_rating、review_count。Pinterest の monthly_views)。日次値を持つ行は period: "daily" を持ちます。利用可能な場合のオーディエンスオブジェクト: demographics (+ demographics_unit) および online_followers (UTC 時間ごとのオンラインフォロワー数。Instagram および TikTok Business、フォロワー 100 人以上)。フラグ: --platform、--date YYYY-MM-DD。指標の範囲はプラットフォームによって異なります — 各行の note を確認してください。 LinkedIn プロフィールは impressions_lifetime に累計の合計値 (これまでに公開されたすべてのコンテンツ。OmniSocials 以外で公開された投稿を含む) を保持し、日次内訳が提供されない場合は period: "lifetime" を持ちます。累計の合計値を期間限定のエクスポートと比較しないでください。キーが欠落している場合は、そのプラットフォームが報告していないことを意味します (Bluesky と Mastodon には表示回数がありません。YouTube の日次値には YouTube Analytics スコープが必要です。TikTok の日次値には Business の認証が必要です)。
受信トレイ(ソーシャル受信トレイ)

接続済みアカウント全体の DM、コメント、メンションを読み取り、返信します。各コメント/メンションのスレッドには、それが付いている投稿(post: id、caption、thumbnail、url、media_type)が含まれます。CLI はスレッドの上にそれを表示するため、投稿を見ながら返信を作成できます。1 つの投稿に対するすべてのコメントは 1 つの会話を共有するため、コメントやメンションへの返信では --message-id <message-id> でコメントを指定する必要があります。指定しない場合、API は投稿への最新の受信コメント(別の人物である可能性があります)の下に返信を投稿します。Instagram と Facebook の DM は、Meta の 24 時間メッセージングウィンドウ(顧客の最後のメッセージから 24 時間以内)内でのみ API 経由で回答できます。配信される各項目には reply_window(open、closes_at)が含まれ、ウィンドウが閉じた DM への返信は何も送信せずに 422 outside_messaging_window を返すため、その DM は Instagram/Facebook アプリから回答するか、inbox:read でスキップします。ネイティブアプリ(Instagram アプリ、Messenger)で入力された返信は送信済みメッセージとして受信トレイにミラーリングされ、回答としてカウントされるため、同僚がスマートフォンで回答したスレッドは未回答として配信されず、ウィンドウが閉じた後にアプリで回答された DM も同様にクリアされます。TikTok は動画コメントのみをサポートします(DM やメンションはありません)。TikTok の返信はテキストのみで、150 文字までです。YouTube は動画コメントのみをサポートします(DM やメンションはありません)。YouTube チャンネルは新しいコメントを 1 日 1 回確認するため、新しい YouTube コメントが表示されるまで最大 1 日かかることがあります。Threads はユーザーの投稿への返信(type: comment)とメンション(DM はありません)をサポートします。返信はネイティブの Threads 返信として公開されます。受信トレイの権限が追加される前に作成された Threads 接続は、ダッシュボードで 1 回再接続する必要があります。それまでは Threads の会話は表示されず、Threads の返信/非表示は 401 reauth_required を返します。ユーザー自身の投稿へのコメントは、Facebook、Instagram、TikTok、YouTube(モデレーションステータスは拒否)、Threads(トップレベルの返信のみ)で inbox:hide により非表示にでき、Facebook、Instagram、TikTok で inbox:delete により完全に削除できます。オプトインの inbox:read / inbox:write スコープが必要です: ユーザーは API キーを作成する際に「Social Inbox access」を有効にします。呼び出しが insufficient_scope を返した場合は、Social Inbox アクセスを有効にした新しいキーを作成するようユーザーに伝えてください。conversation_id の値には : と ()(LinkedIn URN)を含めることができます。inbox:list が返したとおりに正確に渡してください(CLI が URL エンコードを行います)。結果はカーソルページネーションです。さらに結果がある場合、CLI は次のページを取得するための --cursor 値を表示します。 受信トレイへの対応(「inbox:next ループ)。 inbox:next は、回答が必要な項目を 1 件返します。スレッド全体(古い順)、その項目が属する投稿とその reply_window、さらに待機中の件数も含まれます。項目が回答を必要とするのは、それが顧客からの最新の DM で、その後に返信がない場合、またはコメントやメンションでまだ返信されておらず、非表示にもなっていない場合です。キューは 3 つのグループに分けて処理されます。まず、まだ回答できる DM(メタの 24 時間ウィンドウ内の Instagram/Facebook の DM で、ウィンドウが最も早く閉じるものから順に、そしてウィンドウのない X の DM)、次に、24 時間ウィンドウが閉じてしまった Instagram/Facebook の DM(reply_window.open が false。顧客はまだ待っていますが、API では回答できません。ユーザーに Instagram/Facebook アプリから返信するよう伝えるか、inbox:read で項目をスキップしてください)、そしてコメントとメンションを古い順に処理します。--order newest は各グループ内の順序を逆にします。デフォルトでは未読の項目のみが処理されるため、inbox:read <conversation-id> が 1 件をスキップする確実な方法です(その項目は戻ってきません)。--exclude <id,id> は 1 回の呼び出しから会話を除外します(一時的なスキップ、最大 100 件)。--include-read は、既読だがまだ回答されていない項目も処理します。過去 30 日間をさかのぼります。inbox:reply <conversation-id> --text "..." --next で返信すると、レスポンスにすでに次の項目が含まれているため、受信トレイを処理するのは 1 件の回答につき 1 回の呼び出しになります。コメントやメンションの場合、必ず処理されたメッセージ id(「Message to answer」)とともに --message-id <message-id> を追加してください。投稿へのコメントはすべて 1 つの会話を共有しており、これがないと返信は投稿の最新コメントの下に投稿されるため、下書きした相手とは別の人物になる可能性があります。CLI が「Nothing is waiting for an answer.」と表示したらループは終了します。重要な id が 2 つあります。conversation_id(inbox:reply / inbox:read が受け取るもの)と、未回答項目のメッセージ id(--message-id、inbox:hide、inbox:delete が受け取るもの)です。CLI は両方にラベルを付けます。

コマンド説明
inbox:list会話の一覧を表示します(会話ごとに最新のメッセージ)。フラグ: --platform instagram|facebook|linkedin|tiktok|youtube|x|threads、--type dm|comment|mention、--unread(未読メッセージのある会話のみ)、--unanswered(まだ返信が必要な会話のみ: 顧客からの最新の DM にその後の返信がないもの。Instagram/Facebook の DM で 24 時間のウィンドウが閉じたものも含みます(API からは返信できませんが、顧客はまだ待っています。inbox:next はそれらに reply_window を付けて通知します)。または、未返信で非表示になっていないコメント/メンション。ネイティブアプリからの返信は返信としてカウントされます。既読状態は無視されます)、--limit、--cursor。参加者、未読件数、最後のメッセージ、コメント/メンションの場合は関連する投稿を表示します。inbox:read が必要です。
inbox:next次に返信が必要な会話を、そのスレッド(古い順、すべてのメッセージとその id と方向)、対象の投稿とその reply_window({ open, closes_at }。ウィンドウがあるのは Instagram/Facebook の DM のみで、それ以外はすべて open: true, closes_at: null)、さらにあと何件待っているかとともに表示します。次の順序で提供されます: まだ返信できる DM(24 時間のウィンドウ内の Meta の DM を、閉じるのが早い順に、および X の DM)、次にウィンドウが閉じた Instagram/Facebook の DM(open: false、closes_at はいつ閉じたかを示します。CLI は「Reply window closed ...」と表示し、ネイティブアプリで返信するか inbox:read でスキップするよう案内します)、次にコメントとメンションを古い順に表示します。提供されるメッセージ id が、inbox:reply で --message-id が受け取るものです。CLI はそのヒントとともにそれを表示します。フラグ: --platform、--type dm|comment|mention、--order oldest|newest(各グループ内の順序を逆にします)、--include-read(既読だが一度も返信されていない項目も提供します)、--exclude <conversation-id,...>(この呼び出しから除外します。一時的なスキップ、最大 100 件)。デフォルトでは未読の項目のみなので、inbox:read が永続的なスキップとなります。30 日間さかのぼって参照します。キューが空のときは「Nothing is waiting for an answer.」と表示します。inbox:read が必要です。
inbox:messages <conversation-id>1 つの会話の完全なメッセージ履歴を、古い順から新しい順に、それぞれのメッセージ id、方向、タイムスタンプ、既読/返信済み/非表示の状態とともに表示します。コメントスレッドでは最初に投稿ブロック(キャプション、url、サムネイル)を表示します。フラグ: --limit、--cursor。inbox:read が必要です。
inbox:read <conversation-id>会話のメッセージを既読としてマークします。inbox:next の永続的なスキップとしても機能します(既読の会話は --include-read がない限り再度提供されません)。inbox:write が必要です。
inbox:reply <conversation-id>返信を送信します。フラグ: --text(必須)、--message-id <message-id>(返信対象のコメントまたはメンションの inbox id: inbox:next の「Message to answer」id、または inbox:messages のメッセージ id。コメントスレッドでは常にこれを渡してください。投稿へのすべてのコメントは 1 つの会話を共有しており、これがないと返信は最新の受信コメントの下に投稿され、あなたが下書きした相手とは別人である可能性があります。DM では無視されます。この会話の受信メッセージでない場合は 404 not_found、数値でない場合は 400 validation_error)、--attachment-url、--attachment-type、--next(レスポンスには次に返信が必要な会話も含まれ、inbox:next と同様にその reply_window を含めて表示され、残りの件数も表示されます)。inbox:write が必要です。422 outside_messaging_window は、Instagram/Facebook の DM が Meta の 24 時間のウィンドウを過ぎていることを意味します。API はプラットフォームを呼び出す前にこれをチェックするため、何も送信されていません: その DM には Instagram/Facebook アプリから返信するよう(ネイティブの返信は inbox にミラーされ、その項目はクリアされます)、または inbox:read で会話を既読にしてスキップするようユーザーに伝えてください。再試行しないでください。409 duplicate_reply は、このまったく同じ返信が過去 10 分以内にそのコメントまたは DM の会話にすでに送信されていることを意味します(遅い、または失敗したように見えた以前の呼び出しは実際には成功していました): 再度何も送信されていないので、再試行せず、inbox:next で続行してください。422 reply_not_allowed は、プラットフォームがこの項目への返信を恒久的に拒否していることを意味します(Facebook #1705: コメントが投稿のシェアまたはブーストされたコピー上にあるか、コメントした人が返信を制限しています。YouTube: 動画でコメントがオフになっているか、コメントが削除または審査のために保留されているため、スレッドの canReply が false です): その項目は inbox:next から自動的に除外されるので、ユーザーに伝え、再試行しないでください。Threads への返信には、接続に対する Threads の返信権限が必要です。401 reauth_required は、ユーザーがダッシュボードで Threads を再接続する必要があることを意味します。
inbox:hide <message-id>ユーザーの投稿に誰かが残したコメントを、投稿の所有者として非表示にします(--unhide で元に戻します)。Facebook、Instagram、TikTok、YouTube(非表示 = モデレーションステータスが拒否され、その返信も公開表示から除外されます)、および Threads(受信したトップレベルの返信のみ。ネストされた返信は not_hideable を返します)。会話 id ではなく、inbox:messages または inbox:next のメッセージ id を受け取ります。非表示にしたコメントは未返信としてカウントされなくなります。エラー: 403 reconnect_required(モデレーション権限なしでアカウントが接続されました。ダッシュボードで再接続してください)、422 cannot_hide(Facebook はページがこの特定のコメントを非表示にすることを許可していません: コメントした人がページをブロックしている、そのアカウントが無効化または制限されている、またはコメントが投稿の共有コピー上にあります。再試行しても変わることはないので、ユーザーに伝え、表示され続けるべきでない場合は inbox:read を使用してください)、502 hide_not_applied(Instagram のみ: 非表示または再表示の後、API はコメントを読み返し、Instagram 自身の hidden 状態を返します。Instagram が呼び出しを受け入れたのにコメントがまだ古い状態で報告される場合、API はこれを返し、inbox の行は変更されません。これは、Facebook にも共有されているリールで Instagram が「Comments from Facebook」の下に表示するコメントで発生します: それらは Facebook 上にあり、Instagram の非表示はそれらに届きません。Instagram または Facebook アプリで非表示にしてください。再試行しないでください)、429 quota_exceeded(YouTube の 1 日あたりのクォータ。太平洋時間の深夜以降に再試行してください)、401 reauth_required、404 account_not_connected、502 platform_error。inbox:write が必要です。
inbox:delete <message-id>プラットフォームからコメントを完全に削除します。Facebook、Instagram、TikTok のコメントのみです(YouTube: 代わりに inbox:hide を使用してください)。元に戻せないため、最初にユーザーに確認してください。コメントの下の返信も一緒に削除されます。レスポンスはそれらを removed_reply_ids として一覧表示します。会話 id ではなく、メッセージ id を受け取ります。エラーコードは inbox:hide と同じです。inbox:write が必要です。
Webhook
コマンド説明
webhooks:listすべての Webhook を一覧表示します
webhooks:createWebhook を作成します。フラグ: --url (必須)、--events (必須、カンマ区切り: post.scheduled、post.published、post.failed、post.approved、post.rejected)。post.approved は、投稿の承認ワークフローの最後のステップが承認されたときに発火します (投稿は scheduled に移動し、その時刻を過ぎている場合は posting になります)。post.rejected は、承認者が投稿を却下したときに発火します。どちらも data.approval (status、decided_by = 承認者のユーザー ID、reason = 文字列または null) と空の targets 配列を含みます。完全なレビューは posts:approval <id> にあります
webhooks:get <id>Webhook の詳細を取得します
webhooks:update <id>Webhook を更新します。フラグ: --url、--events、--active true|false
webhooks:delete <id>Webhook を削除します
webhooks:rotate-secret <id>Webhook 署名シークレットをローテーションします (新しいシークレットはすぐに保存してください)
グローバルフラグ

すべてのコマンドはこれらのフラグをサポートしています:

フラグ説明
--json生の JSON レスポンスを出力します (パースに便利です)
--api-key <key>このコマンドの API キーを上書きします
--base-url <url>API ベース URL を上書きします
--helpヘルプを表示します

プラットフォーム別リファレンス

コンテンツタイプ対応マトリクス
プラットフォーム投稿ストーリーリールメディア必須
Instagramはいはい (1〜10 枚のスライド、順番に公開されます)はい常に必須 (画像または動画)
Facebookはいはい (1〜10 枚のスライド、順番に公開されます)はい投稿では任意、ストーリー/リールでは必須
LinkedIn (linkedin)はいいいえいいえ任意
LinkedIn ページ (linkedin_page)はいいいえいいえ任意
YouTubeいいえいいえはい (Shorts)常に必須 (動画)
TikTokはいいいえはい常に必須 (画像または動画)
X (Twitter)はいいいえいいえ任意
Pinterestはいいいえいいえ常に必須 (画像または動画 + board_id)
Blueskyはいいいえいいえ任意
Threadsはい (単一投稿、または --threads-thread による 2〜25 パートのスレッド。--threads-location-id による位置タグ。inbox:* による受信トレイの返信/メンション。位置タグはまだ展開中です)いいえいいえ任意
Mastodonはいいいえいいえ任意
Google Businessはいいいえいいえ任意
プラットフォーム別フラグ
Pinterest
フラグ説明
--pinterest-board-idPinterest では必須です。ボード ID は accounts:get <pinterest_account_id> で取得します
--pinterest-titlePin のタイトル
--pinterest-linkPin に添付するリンク URL
--pinterest-video-cover動画 Pin のカバー画像 URL
--pinterest-alt-textPin の代替テキスト
--pinterest-product-tagsPin にタグ付けする商品: Pin ID(pinterest:products から取得)または Pin リンク(https://www.pinterest.com/pin/<id>/)のカンマ区切りリスト、最大 24 件。pinterest.product_tags として送信されます

商品タグ(--pinterest-product-tags):

  • 1 つの Pin につき最大 24 商品です。 24 件を超える場合、または Pin ID でも Pin リンクでもないエントリがある場合は、400 validation_error が返されます。
  • 自分の商品のみです。 Pinterest が商品を受け入れるのは、その Pin が公開されており、同じ Pinterest アカウントに属し、そのアカウントが所有権を確認したウェブサイトにリンクしている場合だけです。他のマーチャントの商品にはタグ付けできません。
  • 拒否された商品があっても投稿が失敗することはありません。 タグは Pin の公開直後に追加されます。Pinterest が 1 つの商品を拒否しても、Pin は公開されたままで、他の商品には引き続きタグが付けられます。
  • 公開後に結果を確認してください。 タグ付けを行った公開済みの投稿には pinterest.product_tags_result が含まれます: requested(送信数)、tagged(Pin 上の Pin ID)、skipped(タグ付けされなかった各商品の pin_id + reason)、error(タグリクエスト自体が失敗した場合、たとえば Pinterest がダウンしていたときに設定され、その場合 tagged は空になります)。posts:list はこれを Pinterest products: 1 of 2 tagged (skipped: <pin_id> PIN_IS_PRIVATE) と表示し、posts:get は完全なオブジェクトを表示します。理由コード: PIN_MISSING(Pin が見つからない)、PIN_IS_PRIVATE、PRODUCT_METADATA_MISSING(商品 Pin ではない)、PIN_NOT_FROM_VERIFIED_DOMAIN(商品リンクが所有権を確認したウェブサイト上のものではない)、PIN_NOT_FROM_SAME_USER_AS_HERO_PIN(別のアカウントの Pin)。どの商品がスキップされたのか、その理由をユーザーに伝えてください。
  • posts:update では、Pinterest のフラグは保存されている Pinterest オプションを 1 つのオブジェクトとして置き換えます。 その投稿に必要なすべての Pinterest フラグを、--pinterest-board-id を含めて再度渡してください。その更新で --pinterest-product-tags を省略すると、タグが削除されます。
  • posts:get は保存されているタグを Pin ID 文字列として pinterest.product_tags に返します(Pin リンクはその Pin ID として保存されます)。
YouTube(ショート)
フラグ説明
--youtube-title動画のタイトル
--youtube-privacy公開範囲: public、private、または unlisted
--youtube-tagsタグ(カンマ区切り)
--youtube-category-idYouTube のカテゴリ ID
--youtube-made-for-kids子ども向けフラグ

ショート用のカスタムサムネイルは --video-cover-json で指定します(動画カバーを参照)。YouTube がショートでこれを表示するのは、カスタムショートサムネイルを有効にしているチャンネル(まずパートナープログラムのチャンネル)のみで、それ以外のチャンネルでは動画の 1 フレームが表示されます。

Instagram
フラグ説明
--instagram-share-to-feedリールをフィードにもシェアします
--instagram-cover-urlリールのカバー画像の URL(--instagram-thumbnail-type from-library と併用)
--instagram-thumbnail-typeサムネイルの種類:from-video または from-library
--instagram-thumb-offset動画の開始からのリールカバー用フレームのタイムスタンプ(ミリ秒)(例:3000 = 0:03。--instagram-thumbnail-type from-video と併用)。posts:get で値を確認できます
--instagram-audio-idリール用のライセンス済み音楽 — audio:search で取得した audio_id。リールのみ(Meta の API ではフィード投稿、カルーセル、ストーリーズに音楽を追加できません)。この Instagram アカウントにリンクされた Page を持つ Facebook アカウントを接続する必要があります。
--instagram-audio-volume音楽の音量 0~100(デフォルト 100)。--instagram-audio-id と併用する場合のみ
--instagram-video-volume動画自体の音声の音量 0~100(デフォルト 100。0 = 音楽のみのリール)
--instagram-trial-reelリールを トライアルリール として公開します — パフォーマンスを試すため、まずフォロワー以外に表示します。トライアルリールをユーザーが明示的に希望した場合にのみ使用してください。リールのみ。 すべてのアカウントで利用できるわけではありません。Instagram はおよそ 1,000 人以上のフォロワーを必要とし、アカウントごとにこの機能を有効にします。対象外のアカウントでは、明確なエラーが表示されて公開に失敗します。
--instagram-trial-graduation-strategyトライアルリールをすべてのフォロワーに公開する方法:MANUAL(デフォルト — ユーザーが Instagram アプリで決定)または SS_PERFORMANCE(パフォーマンスが良好な場合に Instagram が自動的にシェア)。--instagram-trial-reel と併用する場合のみ

フィード画像の縦横比(トップレベルフラグの --media-fit instagram=crop|keep。--instagram-* フラグではありません):Instagram は 9:16~1.91:1 のフィード画像を受け付けますが、表示されるのは 4:5~1.91:1 の範囲のみで、縦長の画像は Instagram 側で 4:5 にトリミングされます。この範囲外のフィード投稿は Meta で宣伝できません。このフラグを指定しない場合、OmniSocials は縦長または横長の画像を Instagram チャンネル用にのみ、被写体を中心に 4:5 / 1.91:1 にトリミングします(他のチャンネルでは元の画像が維持されます)。投稿の作成後に、トリミング後の URL を含む [image_fit] 警告が表示されます。instagram=keep を指定すると元の画像を送信します(Instagram 側でトリミングされ、宣伝はできません)。posts:update <id> --media-fit instagram=keep を指定すると、下書きまたは予約済み投稿の画像が元に戻ります。保持した画像をトリミングするには instagram=crop を指定します。9:16~1.91:1 の範囲外の比率は、引き続き 400 validation_error になります。Per-Platform Media と安全ルールのルール 4 を参照してください。

自動ファーストコメント(Instagram、Facebook、LinkedIn、YouTube、TikTok)

指定したテキストを投稿の公開直後に最初のコメントとして自動投稿します。ハッシュタグやリンクをメインのキャプションに含めたくない場合によく使われます。チャンネルごとにフラグを指定できるため、同じ呼び出しでプラットフォームごとに異なるファーストコメントを設定できます。ストーリーズには投稿されません。

フラグ説明
--instagram-first-commentInstagram の投稿/リールへの最初のコメント(最大 2200 文字)
--facebook-first-commentFacebook 投稿への最初のコメント。Page の投稿のみ(API では個人プロフィールにコメントできません)
--linkedin-first-commentLinkedIn プロフィール投稿への最初のコメント(最大 1250 文字)。「最初のコメントにリンク」を設定する場合に便利です
--linkedin-page-first-commentLinkedIn 企業ページ投稿への最初のコメント(最大 1250 文字)
--youtube-first-commentYouTube 動画への最初のコメント(最大 10000 文字)。動画でコメントが許可されている必要があります
--tiktok-first-commentTikTok 動画への最初のコメント(最大 150 文字)。TikTok チャンネルカードで コメントを有効にする 必要があります(2 回目の TikTok 認証が必要です)。有効になっていない場合、投稿は公開されますが、説明を含むエラーとともに first_comment_result.status が failed になります。動画は公開状態で、コメントが許可されている必要があります。TikTok が公開から数分後に最終的な動画 ID を返す場合、解決後にコメントが自動投稿されます(その間、first_comment_result.pending は true です)
LinkedIn の複数画像スタイル

デフォルトでは、画像が2枚以上ある LinkedIn の投稿は、LinkedIn のスワイプ可能なPDF ドキュメントカルーセルとして公開されます(サーバー側で画像が単一の PDF ドキュメントにレンダリングされます)。以下のフラグを指定すると、この動作を無効にして、通常の複数画像ギャラリーに切り替えられます。チャンネルごとに個別に設定でき、画像が0~1枚の場合、動画、アンケートでは無視されます。

フラグ説明
--linkedin-carousel-as-imagestrue = プロフィール投稿の画像を通常の画像ギャラリーとして公開します。posts:update で false にするとドキュメントカルーセルに戻り、省略すると現在の値が維持されます
--linkedin-page-carousel-as-images会社ページの投稿にも同じ設定を適用します
LinkedIn のドキュメントソース(元の PDF)

チャンネルの画像が、アップロードされた1つの PDF のページを順番どおりに変更せずレンダリングしたものと完全に一致する場合、デフォルトでは保持されている元の PDF ファイルがドキュメントとして LinkedIn に送信されます(鮮明なテキスト、機能するドキュメント内リンク、実際のダウンロード、20枚の上限を超えるページもすべて含まれます)。以下のフラグを指定すると、この動作を無効にして、スライド画像から再構築したドキュメント(フラット化されたコピー)に切り替えられます。画像が PDF のページと一致しない場合、--linkedin-carousel-as-images が true の場合、画像が0~1枚の場合、動画、アンケートでは無視されます。

フラグ説明
--linkedin-document-sourceoriginal_pdf(デフォルト)または slides。posts:update で original_pdf にするとデフォルトに戻り、省略すると現在の値が維持されます
--linkedin-page-document-source会社ページの投稿にも同じ設定を適用します
LinkedIn のアンケート

スポンサーなしのアンケート(LinkedIn の Poll API)です。質問、2~4個の選択肢、期間を指定し、チャンネルごとに個別に設定できます。linkedin(個人プロフィール)と linkedin_page(会社ページ)には、それぞれ独自のアンケートを設定することも、設定しないこともできます。そのチャンネルの投稿ではメディアやリンク共有と併用できません。チャンネルの投稿にメディアやリンクが含まれている場合、公開時にはアンケートが優先されるため、組み合わせないでください。

フラグ説明
--linkedin-poll-jsonチャンネルをキーとする完全な linkedin_poll JSON オブジェクトです:{"linkedin": {"question": "...", "options": ["...", "..."], "duration": "ONE_DAY|THREE_DAYS|SEVEN_DAYS|FOURTEEN_DAYS"}, "linkedin_page": {...}}。各アンケートの question は最大140文字です。options には2~4個の項目が必要で、各項目は最大30文字です。チャンネルのキーを省略するか null に設定すると、そのチャンネルは通常の投稿になります。

posts:update <id> でも使用できます。保存済みの linkedin_poll オブジェクトは全体が置き換えられるため(両方のチャンネル)、希望する状態をすべて送信してください。チャンネルのキーを null に設定するか、フラグ全体に --linkedin-poll-json 'null' を指定すると、そのチャンネルのアンケートが解除され、通常の投稿に戻ります。

# Same poll on the profile only
omnisocials posts:create \
  --content "What should we build next?" \
  --accounts your-linkedin-account-id \
  --linkedin-poll-json '{"linkedin":{"question":"What should we build next?","options":["Mobile app","Public API","More integrations"],"duration":"SEVEN_DAYS"}}'

# A DIFFERENT poll on the profile and the page in one call
omnisocials posts:create \
  --content "What should we build next?" \
  --accounts your-linkedin-profile-account-id,your-linkedin-page-account-id \
  --linkedin-poll-json '{"linkedin":{"question":"What should WE build?","options":["A","B"],"duration":"SEVEN_DAYS"},"linkedin_page":{"question":"What should our COMPANY build?","options":["A","B","C"],"duration":"FOURTEEN_DAYS"}}'
動画カバー

メディアが動画1本(フィード動画またはリール)の投稿のサムネイルです。カバーに対応するすべてのプラットフォーム(Instagram、Facebook、LinkedIn Profile と Page、TikTok、Pinterest、YouTube Shorts)で使用するオブジェクトは1つです。

フラグ説明
--video-cover-json完全な video_cover JSON オブジェクト:{"type": "frame", "thumb_offset": 3000}(動画の開始からのミリ秒)または {"type": "custom", "cover_url": "https://..."}(JPEG/PNG)。さらに任意で、プラットフォーム(instagram、facebook、linkedin、linkedin_page、tiktok、pinterest、youtube)をキーとする "overrides" オブジェクトを指定できます。そのプラットフォームでは、ベースのカバーより優先されます。
  • TikTok が受け付けるのはフレームのみです。 custom カバーはスキップされるため、ユーザーが特定の TikTok フレームを指定したい場合は、"overrides": {"tiktok": {"type": "frame", "thumb_offset": 2000}} を追加してください。
  • YouTube Shorts:チャンネルによって異なります。 カスタム Shorts サムネイルが有効になっているチャンネルでのみ、YouTube は Shorts にカバーを表示します(2026 年 7 月から順次展開され、まずパートナープログラム参加チャンネルが対象です)。それ以外のチャンネルでは、YouTube はカバーを保存しますが、動画のフレームを表示します。チャンネルによって異なると伝え、表示を保証しないでください。
  • 以前からあるプラットフォーム別フラグ(--instagram-cover-url、--instagram-thumb-offset、--tiktok-video-cover-timestamp-ms、--pinterest-video-cover)も引き続き使用でき、対象プラットフォームではベースのカバーより優先されます。
  • posts:update <id> では保存済みのカバー全体が置き換えられます。削除するには --video-cover-json null を指定してください。posts:get は video_cover として返します。
# One custom cover everywhere, a chosen frame on TikTok
omnisocials posts:create \
  --text "New tutorial" \
  --channels <instagram_id>,<facebook_id>,<tiktok_id> \
  --type reel \
  --media-urls "https://example.com/video.mp4" \
  --video-cover-json '{"type":"custom","cover_url":"https://example.com/cover.jpg","overrides":{"tiktok":{"type":"frame","thumb_offset":2000}}}'
TikTok
フラグ説明
--tiktok-title写真カルーセルのみ。TikTok が Photo Mode の投稿でキャプションの上に表示するタイトル(最大 90 文字)。TikTok ではタイトルとキャプションは別々のフィールドです。キャプションは --text から取得されます。動画投稿では無視されます。posts:get は tiktok.title として返します
--tiktok-privacyプライバシー:PUBLIC_TO_EVERYONE、MUTUAL_FOLLOW_FRIENDS、FOLLOWER_OF_CREATOR、SELF_ONLY
--tiktok-disable-commentコメントを無効にする
--tiktok-disable-duetデュエットを無効にする
--tiktok-disable-stitchスティッチを無効にする
--tiktok-video-cover-timestamp-ms動画のみ。カバーに使用するフレームのタイムスタンプ(ミリ秒)
--tiktok-is-aigcAI 生成コンテンツとしてマークする
--tiktok-brand-content-toggle第三者ブランドを宣伝する有料パートナーシップ
--tiktok-brand-organic-toggle自社のビジネス/ブランドを宣伝する
--tiktok-auto-add-music写真カルーセルのみ。TikTok がサウンドトラックを自動選択します
Google Business Profile
フラグ説明
--google-business-cta-action投稿の下に表示する CTA ボタン:LEARN_MORE、BOOK、ORDER、SHOP、SIGN_UP、CALL。GBP のキャプションにはインラインリンクと電話番号を含められません。どちらかを追加する方法は CTA ボタンのみです。そのため、ユーザーが Google Business の投稿にリンクを追加したい場合は、このフラグを使用してください
--google-business-cta-urlCTA のリンク先 URL(http(s)://)。ビジネスプロフィールに登録された店舗の電話番号を使う CALL 以外のすべてのアクションで必須です
--google-business-topic-type投稿タイプ:STANDARD(デフォルト)、EVENT、OFFER
--google-business-jsonEVENT/OFFER 形式の完全な google_business JSON オブジェクト(event.title と、Google の {year,month,day}/{hours,minutes} に分割された日付を含む event.schedule。EVENT と OFFER では必須です。OFFER の場合は、オファー名と有効期間を指定します。offer.couponCode/redeemOnlineUrl/termsConditions も指定できます)。ほかの --google-business-* フラグとマージされます

これら4つのフラグは、下書き/予約投稿の CTA を追加または変更するために、posts:update <id> でも使用できます(保存済みの google_business オブジェクト全体が置き換えられるため、完全な形式を送信してください)。

X(Twitter)
フラグ説明
--x-reply-settings返信できるユーザー:following または mentionedUsers(空文字列 = 全員)
--x-poll-jsonX の投稿に付けるアンケート。テキストが質問になります:{"options":["A","B"],"duration_minutes":1440}(最大25文字の選択肢を2~4個、期間は5~10080分、デフォルトは1440)。アンケートと同時に X にメディアを投稿することはできません。スレッドの場合、アンケートは最初のツイートに付きます。posts:update で null を指定すると削除されます。
--threads-poll-jsonThreads の投稿に付けるアンケート:{"options":["A","B"]}(1~25文字の選択肢を2~4個)。Threads では24時間後に締め切られます。テキストのみの投稿になります。posts:update で null を指定すると削除されます。
--mastodon-poll-jsonMastodon のステータスに付けるアンケート:{"options":["A","B"],"expires_in":86400,"multiple":false,"hide_totals":false}(制限はインスタンスによって異なります。デフォルトは50文字の選択肢4個、期間は5分~1か月)。アンケートと同時にメディアを投稿することはできません。posts:update で null を指定すると削除されます。
--x-thread "a || b || c"スレッドを投稿します。各パートは || で区切ります(2~25パート)。ツイートごとに異なるメディアを付けるには、代わりに --json と完全な x.thread_parts 配列を使って投稿を作成します。
--bluesky-thread "a || b || c"Bluesky のスレッドを投稿します。各パートは || で区切ります(2~25パート。各パートは300文字以下)。リンク、メンション、ハッシュタグは自動的にクリック可能になります。投稿ごとに異なるメディアを付けるには、代わりに --json と完全な bluesky.thread_parts 配列を使って投稿を作成します。
--mastodon-thread "a || b || c"Mastodon のスレッドを投稿します。各パートは || で区切ります(2~25パート。各パートは500文字以下)。各トゥートはネイティブ機能で直前のトゥートに返信します。トゥートごとに異なるメディアを付けるには、代わりに --json と完全な mastodon.thread_parts 配列を使って投稿を作成します。
--threads-thread "a || b || c"Threads(Meta)のスレッドを投稿します。各パートは || で区切ります(2~25パート。各パートは500文字以下)。最初のパートが投稿のキャプションとなり、同じアカウントから直前のパートへの返信として各パートが公開されます。パートごとにメディアを付けるには(各パートにつき最大10項目。画像と動画の混在が可能で、{url, alt} 形式の項目も指定できます)、代わりに --json と完全な threads.thread_parts 配列を使って投稿を作成します。posts:update で threads.thread_parts: null を指定すると、スレッドが単一の投稿に戻ります。Threads の返信権限が必要です。この権限が追加される前に接続したアカウントは、OmniSocials ダッシュボードで一度再接続する必要があります(API は再接続が必要であることを示す 400 エラーを返します)。
--threads-location-id <id>Threads の投稿に位置情報をタグ付けします。locations:search --platform threads で取得した Threads の位置情報 ID を指定します(Facebook Place ID は不可。--location-id の値を再利用しないでください)。複数投稿のスレッドでは、最初の投稿にタグが付きます。posts:update でタグを削除するには、リテラル値 null を指定します。段階的に提供中です。Threads の位置情報タグ付け権限(threads_location_tagging)が必要ですが、Meta はまだ承認していません。承認されるまでは、API は位置情報タグ付けがまだ利用できないことを示す 400 エラーを返します。有効化された後は、以前の接続をダッシュボードで一度再接続する必要があります。
リンクプレビュー(LinkedIn / Facebook)
フラグ説明
--link-urlリンクプレビューカードとして添付する URL
--link-titleプレビュータイトルを上書きします
--link-descriptionプレビューの説明を上書きします
--link-thumbnail-urlプレビューのサムネイル画像を上書きします
Instagram の場所タグと人物タグ
フラグ説明
--location-idタグ付けする Facebook Place ID(locations:search で検索できます)
--collaborators共著者として招待する公開 Instagram ユーザー名(最大3名。カンマ区切り)
--user-tags写真タグの JSON 配列:[{"username":"name","x":0.5,"y":0.5,"image_index":0}](x/y は左上を基準とした0~1の値)
プラットフォームごとのメディア

メディアはすべてのプラットフォームで共通にすることも、プラットフォームごとに変えることもできます。

すべてのプラットフォームで同じメディアを使用する場合:

./scripts/omnisocials.js posts:create --text "..." --channels <ig>,<li> --media-urls "https://example.com/photo.jpg"

プラットフォームごとに異なるメディアを使用する場合(プラットフォームごとのメディアオブジェクトには --json フラグを使い、APIを直接呼び出してください): APIでは、media_urls をオブジェクトとして指定できます:{ "default": ["url1"], "instagram": ["url2"], "pinterest": ["url3"] }。default キーは、専用のキーがないプラットフォームのフォールバックとして使われます。特定のプラットフォームでメディアを使わない場合は、空の配列を渡してください。

チャンネルごとの画像フィット(--media-fit): フィード画像の縦横比がチャンネルでトリミングなしに表示できる範囲外の場合、チャンネルごとにトリミングするか、そのまま表示するかを指定できます。--media-fit instagram=keep,pinterest=crop で設定します(<channel>=<auto|crop|keep> をカンマ区切りで指定し、トップレベルの media_fit オブジェクトとして送信します)。デフォルト(auto)では、Instagramは9:16の画像を4:5に(横長の画像は1.91:1に)画像のフォーカスポイントを中心にトリミングします。Instagramではいずれにしてもこの範囲に切り取られ、Metaでは4:5から1.91:1の範囲外のフィード投稿をブーストできないためです。Pinterestでは2:3より縦長のピンをそのまま表示し、ホームフィードで切り取られる可能性があることを通知します(pinterest=crop を指定すると2:3にトリミングします)。トリミングした画像はそのチャンネル専用の別ファイルです。default とほかのすべてのチャンネルでは元の画像が使われます。対象はフィード投稿のみです。ストーリー、リール、TikTokの写真と動画は変更されません。また、X、LinkedIn、Mastodon、Google Businessでは縦長の画像全体が表示されるため、ルールはありません。各判断は posts:create、posts:create-and-publish、posts:update の後に [image_fit] 警告として出力されます(アクションは、トリミングURLを含む cropped、kept、または元の画像を送信してプラットフォーム側でトリミングすることを示す crop_failed です)。--json では、同じ warnings 配列が data の隣に含まれます。posts:update <id> --media-fit instagram=keep のみを指定すると、保存済みの画像が再判定され、元の画像に戻ります。posts:get --json では、チャンネルのメディア項目に fit と crop: { of, id, ratio, focus } が表示されます。フォーカスポイントはダッシュボードでのみ設定できます。独自にトリミングする場合は、プラットフォームごとの media_urls オブジェクト(上記)を使って、そのチャンネルに別のファイルを渡してください。まず media:check --media-id <id> で確認してください(「Media」を参照)。

URL経由のPDF: --media-urls(またはAPIの media_urls)で渡されたPDFは、ページごとに1枚の画像スライド(順番どおり、最大20枚)にラスタライズされ、元のファイルも保持されます。LinkedInでは元のPDFから作成したスワイプ可能なドキュメントとして公開され、それ以外では画像カルーセルとして公開されます。PDFを media:upload でアップロードした場合と同じ動作です。

代替テキスト(アクセシビリティ向けの説明): media_urls の各項目には、文字列だけでなく { "url": "...", "alt": "..." } オブジェクトを指定できます。また、media_ids の各項目には { "id": "...", "alt": "..." } を指定できます(スレッドの各パートのメディアを含む)。最大1500文字です。Mastodon(メディアの説明。Mastodonコミュニティでは代替テキストが特に重視されています)、Bluesky(埋め込み代替テキスト)、X(写真とGIFのみ、1000文字に制限)、Pinterest(pinterest.alt_text のフォールバック)、Instagram(画像投稿とカルーセルの画像スライドの alt_text。リール/ストーリーは対象外、1000文字に制限)、LinkedIn(単一画像と複数画像の altText。動画/ドキュメントは対象外)、Threads(カルーセル項目やスレッドの各パートを含むすべての画像と動画の alt_text)に送信されます。それ以外のプラットフォームでは無視されます。--media-urls フラグではURLのみ指定できるため、代替テキスト項目を指定するにはAPIを直接呼び出してください。たとえば、Mastodonへの投稿は次のとおりです:{"content": {"default": "Morning ride 🐘"}, "accounts": ["<mastodon_id>"], "media_urls": [{"url": "https://example.com/bike.jpg", "alt": "A red bicycle leaning against a brick wall"}]}。posts:get --json では、各メディア項目の代替テキストを確認できます。

例

接続済みアカウントの一覧表示
./scripts/omnisocials.js accounts:list
LinkedInとXにテキスト投稿を作成
./scripts/omnisocials.js posts:create --text "Excited to announce our new feature!" --channels <linkedin_id>,<x_id>
カバー画像付きのInstagramリールを作成
./scripts/omnisocials.js posts:create --text "Check this out" --channels <instagram_id> --type reel --media-urls "https://example.com/video.mp4" --instagram-share-to-feed --instagram-cover-url "https://example.com/cover.jpg"
ハッシュタグと、自動で追加される最初のコメント内のリンクを含むリール
./scripts/omnisocials.js posts:create --text "New drop is live" --channels <instagram_id> --type reel --media-urls "https://example.com/reel.mp4" --instagram-first-comment "#reels #newdrop #marketing
link: https://example.com/shop"
来週の投稿を予約
./scripts/omnisocials.js posts:create --text "Happy Monday!" --channels <id1>,<id2> --schedule "2026-04-13T09:00:00Z"
Pinterestのピンを作成
./scripts/omnisocials.js posts:create --text "Beautiful design inspiration" --channels <pinterest_id> --media-urls "https://example.com/pin.jpg" --pinterest-board-id <board_id> --pinterest-title "Design Inspiration" --pinterest-link "https://example.com"
Pinterestのピンに商品をタグ付けする
./scripts/omnisocials.js pinterest:products
# Returns: pin_id: 813744226420795884  Blue ribbed top  (24.99 EUR, IN_STOCK, item TOP-BLUE-M)
# Optional: check one Pin ID or Pin link first with pinterest:validate 813744226420795884

./scripts/omnisocials.js posts:create --text "Autumn outfit" --channels <pinterest_id> --media-urls "https://example.com/outfit.jpg" --pinterest-board-id <board_id> --pinterest-product-tags 813744226420795884,813744226420795885

1つのピンにタグ付けできる商品は最大24点です。また、接続済みのPinterestアカウントの商品ピンのみが対象です。Pinterestに拒否された商品があっても投稿は失敗しません。公開後、posts:list に Pinterest products: 1 of 2 tagged (skipped: <pin_id> <reason>) と表示されます。

キーワードにコメントした全員にDMを送信する(コメントからDM)
# A new post with its automation (Instagram must be in --channels). Confirm the DM text and the keyword with the user first
./scripts/omnisocials.js posts:create --text "Comment GUIDE for the free checklist" --channels <instagram_id> --media-urls "https://example.com/photo.jpg" --schedule "2026-10-12T09:00:00Z" --dm-keywords "guide" --dm-message "Here is the checklist: https://example.com/guide" --dm-reply "Sent you a DM!"
# Prints: Comment-to-DM: on (keywords: guide; id 100000006). It starts listening once the post is live on Instagram

# An automation on a post that exists (posts:list for the id; a post published outside OmniSocials takes --instagram-media-id)
./scripts/omnisocials.js automations:create --post-id 83778183 --keywords "guide,link" --dm "Here is the guide: https://example.com/guide" --reply "Sent you a DM!" --reply "Check your inbox" --max-sends 500

# What happened: who commented, who got the DM, and why someone was skipped
./scripts/omnisocials.js automations:events 100000004
# Prints: Counts: 12 sent, 3 skipped, then one line per event:
# 2026-10-10T21:40:00.000Z  comment  sent  @jane  "guide please"  DM: "Here is the guide: ..."

automations:update <id> --pause で一時停止し、--keywords "<full list>" でキーワードを変更し、posts:update <post_id> --no-dm で投稿の自動化を削除します。キーにオプトインの automations:read / automations:write スコープが必要です。

メディアをアップロードして投稿を作成する
./scripts/omnisocials.js media:upload --url "https://example.com/photo.jpg"
# Returns: ID: media_abc123

./scripts/omnisocials.js posts:create --text "New photo!" --channels <id> --media-ids media_abc123
YouTubeショートを作成する
./scripts/omnisocials.js posts:create --text "Quick tip" --channels <youtube_id> --type reel --media-urls "https://example.com/short.mp4" --youtube-title "Quick Tip #1" --youtube-privacy public --youtube-tags "tips,tutorial"
TikTok動画を作成する
./scripts/omnisocials.js posts:create --text "Watch this" --channels <tiktok_id> --type reel --media-urls "https://example.com/video.mp4" --tiktok-privacy PUBLIC_TO_EVERYONE
Xのスレッドを投稿する
./scripts/omnisocials.js posts:create --text "Kicking off a thread" --channels <x_id> --x-thread "First point || Second point || Wrapping up"
Blueskyのスレッドを投稿する
./scripts/omnisocials.js posts:create --channels <bluesky_id> --bluesky-thread "First point || Second point || Wrapping up"
Mastodonのスレッドを投稿する
./scripts/omnisocials.js posts:create --channels <mastodon_id> --mastodon-thread "First point || Second point || Wrapping up"
Threadsのスレッドを投稿する
./scripts/omnisocials.js posts:create --channels <threads_id> --threads-thread "First point || Second point || Wrapping up"
Instagramの位置情報をタグ付けする
./scripts/omnisocials.js locations:search "Blue Bottle Coffee"
# Returns: location_id: 1234567890  Blue Bottle Coffee  — 1 Ferry Building, San Francisco

./scripts/omnisocials.js posts:create --text "Coffee time" --channels <instagram_id> --media-urls "https://example.com/photo.jpg" --location-id 1234567890
Threadsの位置情報をタグ付けする(順次展開中)
./scripts/omnisocials.js locations:search "Griffith Observatory" --platform threads
# Returns: threads.location_id: 17841400000000000  Griffith Observatory  (2800 E Observatory Rd, Los Angeles, United States)
# Coordinates also work: locations:search --platform threads --latitude 34.1184 --longitude -118.3004

./scripts/omnisocials.js posts:create --text "Best view in the city" --channels <threads_id> --threads-location-id 17841400000000000
ローカルファイルをフォルダーにアップロードする
./scripts/omnisocials.js folders:create --name "Summer Campaign"
# Returns: ID: 42

./scripts/omnisocials.js media:upload-base64 --file ./promo.jpg --name "summer-hero" --folder-id 42
複数の投稿の分析データを一括取得する(1回のリクエスト)
./scripts/omnisocials.js analytics:posts 1024,1025,1026
ソーシャル受信箱を確認して返信する
./scripts/omnisocials.js inbox:list --unread --platform instagram
# Returns each conversation with its Conversation: <conversation_id>
./scripts/omnisocials.js inbox:list --unanswered
# Only the conversations still waiting for a reply

./scripts/omnisocials.js inbox:messages "<conversation_id>"
# Comment threads print the post (caption, url, thumbnail) first; every message prints its id
./scripts/omnisocials.js inbox:reply "<conversation_id>" --text "Thanks so much for the kind words!" --message-id "<message_id>"
# --message-id = the id of the comment being answered (all comments on a post share one
# conversation; without it the reply goes under the newest comment); leave it out on a DM
./scripts/omnisocials.js inbox:read "<conversation_id>"

# Hide a comment on your own post (Facebook, Instagram, TikTok, YouTube, Threads),
# using the message id printed by inbox:messages or inbox:next (not the conversation id)
./scripts/omnisocials.js inbox:hide "<message_id>"
./scripts/omnisocials.js inbox:hide "<message_id>" --unhide

# Delete a comment for good (Facebook, Instagram, TikTok; cannot be undone, confirm with the user first)
./scripts/omnisocials.js inbox:delete "<message_id>"
対応待ちのすべてに回答する(inbox:nextのループ)
./scripts/omnisocials.js inbox:next
# Prints the next unanswered item (DMs that can still be answered first, then Instagram/Facebook
# DMs whose 24-hour window has closed, then comments oldest first): the conversation id, the
# message id to answer, its reply window, the post it is on, the thread oldest first, and
# "N more waiting"

# Reply and get the next item in the same call; repeat until the CLI prints
# "Nothing is waiting for an answer." On a comment or mention always pass --message-id
# with the "Message to answer" id; leave it out on a DM
./scripts/omnisocials.js inbox:reply "<conversation_id>" --text "Sent you a DM with the details!" --message-id "<message_id>" --next

# Skip one for good (marking it read means inbox:next will not serve it again). Also how to
# skip an Instagram/Facebook DM whose reply window is closed ("Reply window closed ..." in the
# output): the API cannot answer it, so reply from the app (that clears it too) or mark it read
./scripts/omnisocials.js inbox:read "<conversation_id>"
# Skip some for this call only
./scripts/omnisocials.js inbox:next --exclude "<conversation_id>,<conversation_id>"
# Narrow the queue, or also take items that were read but never answered
./scripts/omnisocials.js inbox:next --platform instagram --type comment
./scripts/omnisocials.js inbox:next --include-read --order newest
新しいワークスペースの既存コンテンツを監査する(OmniSocials経由での投稿がまだない場合)
./scripts/omnisocials.js posts:recent-platform --limit 25
./scripts/omnisocials.js posts:recent-platform --platforms instagram,tiktok --json
LinkedInの会社ページに投稿する
./scripts/omnisocials.js posts:create --text "Company update" --channels linkedin_page
予約済みの投稿をJSON形式で表示する
./scripts/omnisocials.js posts:list --status scheduled --json
過去30日間の分析データを取得する
./scripts/omnisocials.js analytics:overview --period 30d
指定した日付範囲の分析データを取得する
./scripts/omnisocials.js analytics:overview --start-date 2026-03-01 --end-date 2026-03-31
投稿が却下された理由、または誰の確認待ちかを確認する
./scripts/omnisocials.js posts:list --status rejected
./scripts/omnisocials.js posts:approval 123456

Rejected by: Jordan on step 2、Reason: ...、承認者を含む各ステップ、およびレビュアーのコメントが表示されます。投稿がまだレビュー中の場合(posts:list --status in_approval)、同じコマンドで Waiting on: step 2 (Client approval): Jordan と表示されます。投稿を編集したり新しい投稿を作成したりする前に、レビュー内容をユーザーに伝えてください。

投稿通知用のWebhookを作成する
./scripts/omnisocials.js webhooks:create --url "https://yoursite.com/webhook" --events post.published,post.failed
セットアップ(対話形式)
./scripts/omnisocials.js setup
セットアップ(非対話形式)
./scripts/omnisocials.js setup --api-key omsk_live_xxx --global

エラー処理

よくあるエラー
エラー原因対処方法
API key not foundAPIキーが設定されていませんsetup を実行するか、OMNISOCIALS_API_KEY を設定してください
unauthorized / invalid_api_keyAPIキーが無効または期限切れですSettings > API でキーを確認してください
insufficient_scopeAPIキーに必要なスコープがありません必要なスコープを含む新しいキーを作成してください。automations:* または --dm-* 投稿フラグを使用する場合、Automationsはキーでオプトインする必要があります。Settings > API で有効にしてください(automations:read と automations:write が追加されます)
rate_limit_exceededリクエスト数が多すぎます(上限は毎分100回)リセット時刻まで待ってから再試行してください
validation_error必須フィールドが不足しているか、データが無効ですプラットフォームに必要なメディア/フィールドを確認してください
not_foundリソースが存在しませんIDが正しいことを確認してください
max_retries_reachedこの投稿のプラットフォームで、すでに3回の再試行が失敗していますposts:create で投稿を再作成してください
pinterest_not_connectedPinterestアカウントのないワークスペースで pinterest:products を使用していますダッシュボードでPinterestを接続するようユーザーに依頼してください
pinterest_catalog_access_requiredカタログへのアクセス権がない接続で pinterest:products --source catalog を使用していますカタログを接続するようユーザーに依頼してください(コンポーザー、Pinterestオプション、商品を追加、カタログを接続)。または pinterest:products --source pins を実行してください
automation_exists投稿にコメントからDMを送る自動化がすでに設定されています(投稿ごとに1つ)automations:update <id> で変更するか(CLIにIDが表示されます)、先に削除してください
post_required / post_not_instagram--post-id / --instagram-media-id が指定されていない投稿、またはInstagramに投稿されない投稿に対してコメント自動化を設定していますチャネルにInstagramが含まれる投稿を指定するか、--scope next_post / --scope any を使用してください
instagram_not_connected / instagram_needs_reauthワークスペースにInstagramアカウントがないか、接続の有効期限が切れていますダッシュボードでInstagramを接続または再接続するようユーザーに依頼してください
レート制限

API キーごとに、API では1分あたり100件のリクエストが許可されています。レスポンスヘッダーには以下が含まれます。

  • X-RateLimit-Limit:ウィンドウあたりの最大リクエスト数
  • X-RateLimit-Remaining:残りのリクエスト数
  • X-RateLimit-Reset:ウィンドウがリセットされる時刻を示す Unix タイムスタンプ

ヒント

  • まず必ず accounts:list を実行してチャンネル ID とプラットフォームの機能を確認してください
  • 出力をプログラムで解析する必要がある場合は、--json を使用してください
  • コンテンツタイプを確認してください:accounts:list を使用すると、各アカウントが対応しているコンテンツタイプ(投稿、ストーリー、リール)を確認できます
  • Pinterest のボード:accounts:get <pinterest_id> を実行すると、利用可能なボードとその ID を確認できます
  • Pinterest の商品タグ:--pinterest-product-tags 用の商品 Pin ID を取得するには、pinterest:products を実行してください(最大24件、自分の商品 Pin のみ)
  • コメントから DM:投稿を使って作成した自動化(--dm-keywords と --dm-message)は、Instagram で投稿が公開されると開始されます。automations:events <id> では、返信またはスキップしたコメントをすべて確認できます
  • スケジュール設定:日付には ISO 8601 形式を使用してください(例:2026-04-10T14:00:00Z)
  • メディアのアップロード:JPEG、PNG、GIF、WebP 画像と、MP4、MOV、AVI 動画に対応しています(最大50MB)
  • まずは下書きにする:迷った場合は、下書きとして作成し(--schedule を指定しない)、確認してから posts:publish で公開してください。公開せずに時刻を提案する場合は、--draft(予定済みの下書き)とともに --schedule を使用し、ユーザーに posts:update <id> --no-draft で確定してもらってください

コメント