WhatsAppグループ管理者をAPIで変更:昇格と権限解除
UnifyPortでWhatsAppグループの管理者を変更するには、POST /v1/accounts/{account_id}/groups/members に group_id、メンバーのLIDを指定した member_id、action: "promote" または "demote" を送ります。1回の呼び出しで扱うのは1人と1つの操作です。管理者権限の解除は、メンバーを削除する remove とは異なります。まず現在のメンバー情報を読み取り、グループ作成者は通常の降格処理の対象外にしてください。
要点
- メッセージングアカウント、グループ、メンバーをセットで選択します。表示名は識別子ではありません。
- メンバー一覧の
peer_idとして返されるLIDを使い、電話番号から生成しません。 - ボタンを有効にする前に
member、admin、superadminを区別します。 - リクエスト後は状態を再取得します。タイムアウト時に逆の操作を自動送信しないでください。
変更したい役割を先に決める
WhatsAppの公式管理者ガイドは管理者の解除方法を説明し、グループ作成者は削除できず、自ら退出しない限り管理者であり続けるとしています。API連携でもこのルールは変わりません。
以下はアプリケーション側の推奨ルールです。すべてのリクエストがプラットフォームに受け入れられる保証ではありません。
| 現在の役割 | 操作者の意図 | アプリケーションの判断 |
|---|---|---|
member | 管理者にする | 権限確認後に promote を提示 |
admin | 在籍したまま管理権限を外す | 確認後に demote を提示 |
superadmin | 作成者の権限を外す | 処理を止め、作成者の制約を説明 |
| すでに目的の役割 | 同じ変更を繰り返す | 再送せず表示を更新 |
| メンバー情報が不明・不完全 | そのまま変更する | 再取得または手動確認 |
これは参加承認の処理ではありません。参加を認めるかどうかはWhatsApp参加申請の承認キュー、招待を共有する場合はグループ招待リンクの取得フローを使います。どちらも管理者の任命とは別の操作です。
最新の一覧から対象を選ぶ
選択したアカウントで会話メンバー一覧を取得します。グループの conversation_id を渡し、cursor でページを進め、対象行の peer_id と role を保持してください。役割は member、admin、superadmin で、最後の値は所有者または作成者を意味します。
以下は読み取りリクエストの例です。環境変数にはバックエンドで実際に選択した値を設定します。
curl --get \
"https://api.unifyport.ai/v1/accounts/${UNIFYPORT_ACCOUNT_ID}/conversations/members" \
-H "X-Api-Key: ${UNIFYPORT_API_KEY}" \
--data-urlencode "conversation_id=${WHATSAPP_GROUP_ID}" \
--data-urlencode "type=group" \
--data-urlencode "limit=50"
data.has_more が真なら、返された data.next_cursor で続けます。最初のページにいないだけでは退出した証拠になりません。LIDはそのまま保持し、電話番号、表示名、形式の異なるイベント内の参加者IDから作らないでください。
送信前に、操作者がそのアカウントとグループを管理できること、接続中のWhatsAppアカウントに必要なグループ権限があることを確認します。ワークスペースのAPIアクセス権は、グループ管理者権限を意味しません。APIキーはサーバー内で管理します。
明示的な変更を1件ずつ送る
グループメンバー管理リファレンスは add、remove、promote、demote を定義しています。役割変更には後ろの2つだけを使い、単数の member_id を渡します。参加承認用の member_ids 配列ではありません。
次のJavaScriptは選択済みレコードから本文を組み立てる例です。認可の確認やネットワーク送信は行いません。
function roleChangeBody(groupId, selectedMember, action) {
const expectedRole = { promote: 'member', demote: 'admin' };
if (!Object.hasOwn(expectedRole, action) ||
selectedMember?.role !== expectedRole[action]) {
throw new Error('Refresh membership before changing this role');
}
if (!groupId || !selectedMember?.peer_id?.endsWith('@lid')) {
throw new Error('Select a group and a returned WhatsApp member LID');
}
return {
group_id: groupId,
member_id: selectedMember.peer_id,
action
};
}
JSONはバックエンドから、X-Api-Key を付けて文書化されたエンドポイントへ送ります。接尾辞の確認はローカルな誤操作防止にすぎず、本人性や権限を証明しません。確認画面にはグループ、参加者、操作を明示してください。更新中の一覧で先頭にある行から対象を決めてはいけません。
UnifyPortは接続アカウント向けの非公式インターフェースです。現在のチャネル別操作対応表では、この書き込みは whatsapp のみが対象です。LINE、Telegram、別プロバイダーの whatsapp-protocol は含まれません。LINEなどでメンバーを読めることやグループイベントを受け取れることから、役割変更まで可能だと判断しないでください。
結果を確認し、トランザクションを仮定しない
成功レスポンスは 200 OK と data.ok: true として文書化されています。HTTP結果と request_id を保存し、メンバー情報を再取得して、観測した役割と操作者の意図を分けて表示します。
推奨する対策は次のとおりです。
- 同じアカウント・グループ・メンバーへのアプリ内操作を直列化する。
- 送信直前に役割を再確認する。ダイアログを開いた後に他の管理者が変更している可能性がある。
- タイムアウト時は結果を未確定とし、現在のメンバー情報を確認する。自動再送や逆操作による補償をしない。
- 複数人の引き継ぎを不可分な処理と考えない。新しい管理者の役割を確認してから、別の操作として旧担当者の権限解除を検討する。
標準の group.updated では、data.changes[] に kind: "promoted" または "demoted" と members[] が含まれる場合があります。再確認のきっかけには使えますが、各リクエストに必ず届く受領通知ではありません。イベントの参加者IDをそのまま次の書き込み用LIDに使えるとも限りません。Webhookを処理する場合は署名と配信のリファレンスに従い、本文を信頼する前に検証し、重複や順序の入れ替わりに対応してください。
よくある質問
demote はグループからの削除ですか?
いいえ。管理者権限の解除とメンバー削除は別です。「管理者を解除」ボタンに remove を割り当てないでください。
グループ作成者の役割も変更できますか?
このフローでは提供しないでください。WhatsAppでは作成者は自ら退出するまで管理者です。UnifyPortのメンバー一覧では superadmin として表されます。
1回で複数の管理者を変更できますか?
このエンドポイントではできません。1つの member_id と1つの操作を受け付けます。アプリ側でまとめて処理する場合も結果は個別に記録します。
次のステップと資料
まず会話メンバー一覧を実装し、グループメンバー管理に沿って操作ボタンを追加してください。本番導入前に、ページング、作成者の選択、古い役割情報、権限不足、ネットワーク結果不明をテストします。これは推奨テスト項目であり、実行済みの結果ではありません。
確認日:2026-10-17。
メッセージ連携を安定したプロダクトパイプラインへ。
まずは 1 つの API で送信を始め、標準イベントですべての inbound メッセージを業務システムへ戻しましょう。