コンテンツ公開

コンテンツ公開APIを使えば、Instagramプロアカウントで、1つの画像、動画、リール動画(単一メディア投稿)、複数の画像や動画が含まれる投稿(カルーセル投稿)を公開することができます。

2023年7月1日より、Instagramコンテンツ公開APIを通じて公開された単一フィード動画はすべてリールとしてシェアされます。

要件

アクセストークン

すべてのリクエストに、アプリユーザーのユーザーアクセストークンを含めることが必要です。

アクセス許可

公開は、次のアクセス許可の組み合わせに依存しています。厳密な組み合わせは、アプリがどのエンドポイントを使用するかによって異なります。各エンドポイントの必要なアクセス許可を確認するには、エンドポイントのリファレンスをご覧ください。

アプリに対する権限も、アプリを取得したビジネスでの権限も持たないアプリユーザーがアプリを使用する場合、まずアプリレビューにより各アクセス許可の承認をリクエストして、権限のないアプリユーザーがそれらの許可をアプリに付与できるようにしなければなりません。

公開サーバー

公開試行の際に使用されるメディアにcURLが付けられるため、メディアは公開試行の時点で公開アクセス可能なサーバー上でホスティングされていなければなりません。

ページ公開認証

ページ公開認証(PPA)を必要とするページにリンクしているInstagramプロアカウントは、PPAが完了するまで公開できません。

最初はPPAが必要でないものの後になってPPAが必要になるページで、アプリユーザーがタスクを実行できる場合があります。その場合、アプリユーザーは、PPAが完了するまでコンテンツをInstagramプロアカウントに公開できません。アプリユーザーのページにPPAが必要かどうかを確認する方法はないため、事前にPPAを完了しておくようアプリユーザーに促すことをおすすめします。

制限

  • サポートされている画像形式はJPEGだけです。MPOやJPSなどの拡張JPEG形式はサポートされていません。
  • ショッピングタグはサポートされていません。
  • ブランドコンテンツタグはサポートされていません。
  • フィルターはサポートされていません。
  • Instagram TVへの公開はサポートされていません。

その他の制限については、各エンドポイントのリファレンスをご覧ください。

レート制限

InstagramアカウントのAPI公開投稿は、24時間以内で50件までに制限されます。カルーセルは1件の投稿としてカウントされます。この制限は、POST /{ig-user-id}/media_publishエンドポイントでメディアコンテナを公開しようとする際に適用されます。アプリでも公開レート制限を適用することをおすすめします(特に、ユーザーが投稿の公開をスケジュール設定できるようにしているアプリの場合)。

Instagramプロアカウントの現在のレート制限使用率を確認するには、GET /{ig-user-id}/content_publishing_limitエンドポイントをクエリします。

エンドポイント

このAPIは次のエンドポイントで構成されています。使用要件については、各エンドポイントのリファレンスドキュメントを参照してください。

単一メディア投稿

単一の画像、動画、ストーリーズ、リール動画の公開は、2ステップの処理です。

  1. POST /{ig-user-id}/mediaエンドポイントを使って、公開サーバーでホスティングされている画像または動画を含むコンテナを作成します。
  2. 次に、POST /{ig-user-id}/media_publishエンドポイントを使用してそのコンテナを公開します。

ステップ1/2: コンテナを作成する

画像が次の場所にあるとします。

https://www.example.com/images/bronz-fonz.jpg

キャプションとしてハッシュタグ「#BronzFonz」を付けて公開するとします。POST /{ig-user-id}/mediaエンドポイントにリクエストを送信します。

リクエストの例

POST https://graph.facebook.com/v21.0/17841400008460056/media
  ?image_url=https://www.example.com/images/bronz-fonz.jpg
  &caption=#BronzFonz

画像のコンテナIDが返されます。

応答の例

{
  "id": "17889455560051444"  // IG Container ID
}

ステップ2/2: コンテナを公開する

前のステップで返されたコンテナIDを、POST /{ig-user-id}/media_publishエンドポイントを使用して公開します。

リクエストの例

POST https://graph.facebook.com/v21.0/17841400008460056/media_publish ?creation_id=17889455560051444

応答の例

{
  "id": "17920238422030506" // IG Media ID
}

カルーセル投稿

1回の投稿で画像、動画、またはそれらのミックス(カルーセル投稿)を10個まで公開できます。カルーセルの公開は、3ステップのプロセスです。

  1. POST /{ig-user-id}/mediaエンドポイントを使って、カルーセルに表示される各画像と各動画のアイテムコンテナを個別に作成します。
  2. もう一度POST /{ig-user-id}/mediaエンドポイントを使って、これらのアイテムのカルーセルコンテナを1つ作成します。
  3. POST /{ig-user-id}/media_publishエンドポイントを使って、カルーセルコンテナを公開します。

カルーセル投稿は、アカウントのレート制限において1件の投稿としてカウントされます。

制限

  • カルーセルの宣伝はできません。
  • カルーセルの画像、動画、またはそれらのミックスは10個までに制限されています。
  • カルーセルの画像はすべてカルーセルの最初の画像から切り取られます。デフォルトのアスペクト比は1:1です。

ステップ1/3: アイテムコンテナを作成する

POST /{ig-user-id}/mediaエンドポイントを使って、カルーセルに表示される画像や動画のアイテムコンテナを作成します。カルーセルには最大10件の画像、動画、またはこれら2つのミックスを含めることができます。

POST /{ig-user-id}/media

パラメーター

以下のパラメーターは必須です。サポートされるその他のパラメーターについては、POST /{ig-user-id}/mediaエンドポイントのリファレンスをご覧ください。

  • is_carousel_itemtrueに設定します。画像または動画がカルーセル内に表示されることを示します。
  • image_url — (画像のみ)画像へのパス。渡されたURLを使用して画像にcURLを付けます。そのため、公開サーバー上のパスでなければなりません。
  • media_type — (動画のみ) VIDEOに設定されます。メディアが動画であることを示します。
  • video_url — (動画のみ)動画へのパス。渡されたURLを使用して動画にcURLを付けるので、このパスは公開サーバー上のパスでなければなりません。

処理が成功すると、APIからアイテムコンテナIDが返されます。カルーセルコンテナ作成時にそれを使うことができます。

カルーセルに表示する画像や動画ごとに、この処理を繰り返します。

リクエストの例

curl -i -X POST \

"https://graph.facebook.com/v21.0/90010177253934/media?image_url=https%3A%2F%2Fsol...&is_carousel_item=true&access_token=EAAOc..."

応答の例

{
  "id": "17899506308402767"
}

ステップ2/3: カルーセルコンテナを作成する

POST /{ig-user-id}/mediaエンドポイントを使って、カルーセルコンテナを作成します。

POST /{ig-user-id}/media

パラメーター

以下のパラメーターは必須です。サポートされるその他のパラメーターについては、POST /{ig-user-id}/mediaエンドポイントのリファレンスをご覧ください。

  • media_typeCAROUSELに設定されます。コンテナの対象がカルーセルであることを示します。
  • children — 公開されたカルーセルに表示される各画像と各動画の最大10個のコンテナIDの配列。カルーセルには最大10件の画像、動画、またはそれら2つのミックスを使用できます。

リクエストの例

curl -i -X POST \

"https://graph.facebook.com/v21.0/90010177253934/media?caption=Fruit%20candies&media_type=CAROUSEL&children=17899506308402767%2C18193870522147812%2C17853844403701904&access_token=EAAOc..."

応答の例

{
  "id": "18000748627392977"
}

ステップ3/3: カルーセルコンテナを公開する

POST /{ig-user-id}/media_publishエンドポイントを使って、カルーセルコンテナを公開します(カルーセル投稿)。アカウントには、公開投稿は24時間以内に50件までという制限があります。カルーセルの公開は1件の投稿としてカウントされます。

POST /{ig-user-id}/media_publish

パラメーター

以下のパラメーターは必須です。

  • creation_id — カルーセルコンテナID。

操作が成功すると、APIからカルーセルアルバムIGメディアIDが返されます。

リクエストの例

curl -i -X POST \

"https://graph.facebook.com/v21.0/90010177253934/media_publish?creation_id=18000748627392977&access_token=EAAOc..."

応答の例

{
  "id": "90010778390276"
}

リールの投稿

リールとは、特定の仕様を満たし、当社のアルゴリズムで選択された場合に、Instagramアプリの[リール]タブに表示できる短い形式の動画のことです。リール動画を公開する手順は、単一メディア投稿の公開手順と同じですが、video_urlパラメーターを使う動画へのパスと共にmedia_type=REELSパラメーターを指定してください。

リール動画の公開時にmedia_type=REELSを設定するとはいえ、リールは新しいメディアタイプというわけではありません。リール動画を公開し、次にその動画のmedia_typeフィールドをリクエストした場合、返される値はVIDEOになります。公開された動画がリールとして指定されているかどうかを判断するには、代わりにmedia_product_typeフィールドをリクエストします。

GitHubにあるコードサンプル(insta_reels_publishing_api_sample)を使用して、Instagramにリールを公開する方法を学べます。

開発者にとってより便利になるように、MetaはPostman APIプラットフォームでInstagramリールを公開するための、フルセットのグラフAPI呼び出を公開しています。詳細は、FacebookリールとInstagramリールのPostmanコレクションをご覧ください。

リールについて詳しくは、リール開発者向けのドキュメントをご覧ください。

ストーリーズ投稿

現時点では、Content Publishing APIを使用してストーリーズを公開できるのはビジネスアカウントのみです。

ストーリーズとは、Instagram上にIGストーリーズとして投稿される動画や画像のことです。ストーリーズを公開する手順は、単一メディア投稿の公開手順と同じですが、media_type=STORIESパラメーターを指定し、image_urlパラメーターかvideo_urlパラメーターを使って画像/動画へのパスを指定します。

注: ストーリーズの公開時にmedia_type=STORIESを設定するとはいえ、ストーリーズは新しいメディアタイプというわけではありません。ストーリーズを公開し、次にその動画のmedia_typeフィールドをリクエストした場合、値はIMAGE/VIDEOとして返されます。公開済みの画像/動画がストーリーズとして指定されているかどうかを判断するには、代わりにそのmedia_product_typeフィールドをリクエストしてください。

再開可能なアップロードプロトコル

再開可能なアップロードプロトコルはInstagramコンテンツを公開するための新しいフローであり、リール、動画ストーリーズ、動画カルーセルアイテムmedia_typesの動画アップロードをサポートします。

この新しいプロトコルは、ローカル動画と公開ホストURL動画の両方から、Instagramメディアの作成をサポートしています。このプロトコルにより、ネットワーク中断やその他の送信失敗の後、ローカルファイルのアップロード操作を再開できるようになるため、ネットワークの失敗時に時間と帯域幅が節約されます。また、同じメディア仕様を保持しています。

エンドポイント

  • POST https://graph.facebook.com/{api-version}/{ig-user-id}/media — set upload_type=resumableで動画作成コンテナを初期化します。
  • POST https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id} — 再開可能なアップロードプロトコルを使用して、ローカル動画ファイルまたはホストされたURLから動画をより信頼性の高い方法でアップロードします。
  • POST https://graph.facebook.com/{api-version}/{ig-user-id}/media_publish — アップロードされたメディアを、そのメディアコンテナを使って公開します。
  • GET /{ig-container-id}?fields=status_code — メディアコンテナの公開の可否とステータスをチェックします。

HTML URLエンコーディングのヒント

  • パラメーターの一部は、list/dictフォーマットでサポートされています。
  • 一部の文字は、インターネットで送信できるフォーマットにエンコードする必要があります。例えば、user_tags=[{username:’ig_user_name’}]user_tags=%5B%7Busername:ig_user_name%7D%5Dにエンコードされます。この場合、[%5Bに、{%7Bにそれぞれエンコードされます。その他の変換については、HTML URLエンコーディング標準を参照してください。

ステップ1: リール、動画ストーリーズ、カルーセルアイテムのアップロードセッションを初期化する

リールのリクエストの例

curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \
    -d "media_type=REELS" \
    -d "upload_type=resumable" \
    -d "caption={caption}"\
    -d "collaborators={collaborators-username}"
    -d "cover_url={cover-url}" \
    -d "audio_name={audio-name}" \
    -d "user_tags={user-tags}" \
    -d "location_id={location-id}" \
    -d "thumb_offset={thumb-offset}" \
    -H "Authorization: OAuth {access-token}"

動画ストーリーズのリクエストの例

curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \
    -d "media_type=STORIES" \
    -d "upload_type=resumable" \
    -H "Authorization: OAuth {access-token}"

カルーセル動画アイテムのリクエストの例

curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \
    -d "media_type=VIDEO" \
    -d "is_carousel_item=true" \
    -d "upload_type=resumable" \
    -H "Authorization: OAuth {access-token}"

応答の例

{
   "id": "{ig-container-id}",
   "uri": "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}"
}

ステップ2: 再開可能なアップロードプロトコルを使用して動画をアップロードする

ほとんどのグラフAPI呼び出しはgraph.facebook.comホストを使用しますが、リール用の動画をアップロードする呼び出しはrupload.facebook.comを使用します。

アップロードされた動画ファイルでは、次のファイルソースがサポートされています。

  • コンピューター上にあるファイル
  • CDNなどの公開サーバーでホストされているファイル

ローカル動画ファイルをアップロードするリクエストの例

再開可能なアップロードセッション呼び出しから返されたig-container-idで動画をアップロードします。

  • ホストがrupload.facebook.comであることを確認してください。
  • すべてのmedia_typeは、同じフローを共有して動画をアップロードします。
  • ig-container-idは、再開可能なアップロードセッション呼び出しから返されたIDです。
  • access-tokenは、前のステップで使われているものと同じです。
  • offsetは、アップロードされる最初のバイトに設定され、通常は0です。
  • file_sizeは、バイト単位でファイルのサイズに設定されます。
  • Your_file_local_pathは、ローカルファイルのファイルパスに設定されます。例えば、macOSでDownloadsフォルダーからファイルをアップロードする場合、パスは@Downloads/example.movです。
curl -X POST "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}" \
     -H "Authorization: OAuth {access-token}" \
     -H "offset: 0" \
     -H "file_size: Your_file_size_in_bytes" \
     --data-binary "@my_video_file.mp4"

公開ホスト動画をアップロードするリクエストの例

curl -X POST "https://rupload.facebook.com/ig-api-upload/{api-version}/{ig-container-id}" \
     -H "Authorization: OAuth {access-token}" \
     -H "file_url: https://example_hosted_video.com"

応答の例

// Success Response Message
{
  "success":true,
  "message":"Upload successful."
}

// Failure Response Message
{
  "debug_info":{
    "retriable":false,
    "type":"ProcessingFailedError",
    "message":"{\"success\":false,\"error\":{\"message\":\"unauthorized user request\"}}"
  }
}

ステップ3: (カルーセルのみ)カルーセルコンテナを作成する

ステップ1と2を再度実行して、is_carousel_itemパラメーターがtrueに設定された複数のig-container-idsを作成することができます。次に、カルーセルコンテナを作成してすべてのカルーセルアイテムを含めます。カルーセルアイテムは画像や動画とミックスできます。

curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media" \
    -d "media_type=CAROUSEL" \
    -d "caption={caption}"\
    -d "collaborators={collaborator-usernames}" \
    -d "location_id={location-id}" \
    -d "product_tags={product-tags}" \
    -d "children=[{ig-container-id},{ig-container-id}...]" \
    -H "Authorization: OAuth {access-token}"

ステップ4: メディアを公開する

リールと動画ストーリーズの場合、ステップ1で作成した{ig-container-id}を使用して動画を公開します。カルーセルコンテナの場合、ステップ3で作成した{ig-container-id}を使用してカルーセルコンテナを公開します。

curl -X POST "https://graph.facebook.com/{api-version}/{ig-user-id}/media_publish" \
    -d "creation_id={ig-container-id}" \
    -H "Authorization: OAuth {access-token}"

ステップ5: メディアステータスを取得する

graph.facebook.comは、アップロードのステータスを読み取るためのGETエンドポイントを提供します。video_statusフィールドには、ローカルアップロードプロセスの詳細が含まれています。

  • uploading_phaseは、ファイルのアップロードに成功したかどうかに加えて、何バイト転送されたかを示します。
  • processing_phaseには、動画ファイルがアップロードされた後の動画処理のステータスに関する詳細が含まれています。
// GET status from graph.facebook.com
curl -X GET "https://graph.facebook.com/v19.0/{ig-container-id}?fields=id,status,status_code,video_status" \
    -H "Authorization: OAuth {access-token}"

graph.facebook.comエンドポイントからの応答の例

// A successfully created ig container
{
  "id": "{ig-container-id}",
  "status": "Published: Media has been successfully published.",
  "status_code": "PUBLISHED",
  "video_status": {
    "uploading_phase": {
      "status": "complete",
      "bytes_transferred": 37006904
    },
    "processing_phase": {
      "status": "complete"
    }
  }
}

// An interrupted ig container creation, from here you can resume your upload in step 2 with offset=50002. 
{
  "id": "{ig-container-id}",
  "status": "Published: Media has been successfully published.",
  "status_code": "PUBLISHED",
  "video_status": {
    "uploading_phase": {
      "status": "in_progress",
      "bytes_transferred": 50002
    },
    "processing_phase": {
      "status": "not_started"
    }
  }
}

コラボレータータグ

画像、カルーセル、リール動画にInstagramの公開ユーザーをコラボレーターとして追加することができます。コラボレーターには、その特定のメディアのコラボレーターになるための招待が送られます。画像の中でユーザーをタグ付けするには、上記の単一メディア投稿の手順に従いますが、メディアコンテナを作成する際には、コラボレーターパラメーターと、メディアのコラボレーターとして招待したいユーザーのInstagramユーザー名を示す文字列の配列を含めてください。

リクエストの例

POST graph.facebook.com/17841400008460056/media
?image_url=https://www.example.com/images/bronzed-fonzes.jpg
&caption=#BronzedFonzes!
&collaborators= [‘username1’,’username2’]

注:

  • コラボレーター値は文字列の配列でなければなりません。
  • 公開Instagramアカウントを持つユーザーのみタグ付けできます。
  • メディアに追加できるコラボレーターは3人までです。
  • コラボレーターをストーリーメディアに追加することはできません。

位置情報タグ

ページ検索APIを使用できます。検索文字列と一致する名前のページを検索するには、クエリに必ず`location`フィールドを含めてください。その後、結果を解析して、所在地向けに作成されたページを特定します。画像または動画を公開する際にページのIDを含めると、そのページに関連付けられた位置情報がタグ付けされます。

制限

タグ付けを利用するには、ページに緯度と経度の位置データが必要です。

使用するページの応答に緯度と経度のデータがあることを確認してください。位置情報データがないページを使ってコンテナを作成しようとすると、コード化された例外INSTAGRAM_PLATFORM_API__INVALID_LOCATION_IDで失敗します。

ページIDを取得したら、それを、単一メディアまたはカルーセルアイテムのコンテナを公開するときのlocation_idパラメーターに代入します。

商品タグ

単一メディアの投稿と、Instagramショッピングの商品をタグ付けしたカルーセル投稿の両方を公開することができます。方法については、製品のタグ付けガイドを参照してください。

ユーザータグ

画像の中で公開Instagramユーザーをタグ付けすることができます。タグ付けされるとそれらのユーザーに通知が送られます。

画像の中でユーザーをタグ付けするには、上記の単一メディア投稿の手順に従いますが、メディアコンテナを作成する際に、user_tagsパラメーターと、画像の中のInstagramユーザーを指すオブジェクトの配列、および画像内自体のx/y座標を含めます。

注: ユーザータグは、カルーセル内の動画メディアではサポートされません。

リクエストの例

POST graph.facebook.com/17841400008460056/media ?image_url=https://www.example.com/images/bronzed-fonzes.jpg &caption=#BronzedFonzes! &user_tags= [ { username:'kevinhart4real', x: 0.5, y: 0.8 }, { username:'therock', x: 0.3, y: 0.2 } ] 

コンテナIDが返されます。それを、IGユーザーメディア公開エンドポイントを使って公開します。

注:

  • user_tags値は、JSON形式のオブジェクトの配列でなければなりません。
  • 公開Instagramアカウントを持つユーザーのみタグ付けできます。
  • オブジェクトには、各ユーザーの3つのプロパティ(usernamexy)すべてを含める必要があります。
  • x値とy値は、画像の左上を起点とするfloat数値で、範囲は0.01.0です。

トラブルシューティング

動画のコンテナを作成できるのに、POST /{ig-user-id}/media_publishエンドポイントが公開されたメディアIDを返さない場合、GET /{ig-container-id}?fields=status_codeエンドポイントをクエリしてコンテナの公開ステータスを取得できます。このエンドポイントは次のいずれかを返します。

  • EXPIRED — コンテナは24時間以内に公開されず、有効期限が切れています。
  • ERROR — コンテナは、公開処理を完了できませんでした。
  • FINISHED — コンテナとそのメディアオブジェクトは公開の準備ができています。
  • IN_PROGRESS — コンテナは、まだ公開処理中です。
  • PUBLISHED — コンテナのメディアオブジェクトは公開済みです。

コンテナのステータスを5分間程度、毎分クエリすることをおすすめします。

エラー

エラーコードのリファレンスをご覧ください。