LinkedIn APIで個人投稿と会社ページ投稿を分けて実装する理由
SNS予約投稿サービス「sns-poster」で、LinkedInへの投稿が突然失敗しました。Posts APIが 401 DISABLED_APPLICATION を返したのが原因です。調べていくと、個人のフィードへの投稿と会社ページへの投稿は、アプリもOAuthフローも分けて作るべきだと分かりました。その経緯と設計をまとめます。
何が起きたか
2026年9月16日から、LinkedInへの投稿が失敗するようになりました。APIの応答は次のとおりです。
401 DISABLED_APPLICATION
「認証が切れた」のではなく、「そのClient IDのアプリが無効」という意味です。トークンを取り直しても直りません。
原因
LinkedIn Developer Portalには、アプリが2つありました。
- 以前に作った動作確認用のアプリ(すでに削除済み)
- Community Management APIの審査を受けるために作ったアプリ
サーバーの .env の LINKEDIN_CLIENT_ID が、削除済みの1つ目のアプリを指したままでした。アプリを消した結果、そのClient IDを使うAPI呼び出しがすべて DISABLED_APPLICATION になったのです。
では2つ目のアプリに切り替えればよいかというと、そうはいきませんでした。2つ目のアプリは、Community Management APIの審査のためだけに作ったもので、Share on LinkedIn(個人の投稿に必要な権限)の製品が追加されていませんでした。
直し方
個人投稿用に、新しいアプリを作りました。
- 個人投稿専用のアプリを新規作成する
- 製品として「Share on LinkedIn」と「Sign In with LinkedIn using OpenID Connect」を追加する
- リダイレクトURLに、自社のコールバックURLを登録する
.envのClient IDとシークレットを新しいアプリのものに更新する- テスト投稿で確認する
これで投稿が復旧しました。
なぜ個人投稿と会社ページ投稿を分けるのか
今回の件で、次の設計に決めました。
- 個人フィードへの投稿と会社ページへの投稿は、別のOAuthフロー・別のClient IDにする
- 利用者が連携するとき、どちらにつなぐかを選ぶ
- 1人の利用者が両方につなぐ場合は、個人用と会社ページ用のトークンを別々の連携レコードとして保存する
理由は2つあります。
1. 必要なAPI製品が違う
個人の投稿は「Share on LinkedIn」で行えます。会社ページへの投稿には、Community Management APIが必要で、こちらは別途審査があります。仕様は変更されることがあるため、公式ドキュメントで最新の内容を確認してください。
2. 失敗の影響範囲を分けられる
アプリを分けておけば、片方のアプリを整理・削除したり、審査で止まったりしても、もう片方の投稿は動き続けます。今回の障害は、まさにアプリ整理の影響が投稿に波及した例です。
現在の状況
2026年9月時点で、Community Management APIの審査は「Review in progress」でした。会社ページ投稿は、審査の結果を待って実装する方針です。
まとめ:LinkedIn連携で最初に確認すること
DISABLED_APPLICATIONが出たら、トークンではなくClient IDが指すアプリの状態を疑う.envなどの設定が、削除済みや別用途のアプリを指していないかを確認する- 個人投稿用と会社ページ用で、アプリ(Client ID)を分けて作る
- 審査待ちのアプリには、動作中の機能を載せない
sns-posterは、LinkedInを含む複数のSNSへ予約投稿できるサービスです。詳しくは機能ページをご覧ください。