会話ステータスを更新
指定した会話のステータスを変更するには、toggle_status API を使用します。サーバーは、対象ステータスが STATUS_TRANSITIONS の状態遷移マトリクスに従って有効かどうかを検証します。
リクエストメソッド
POST
エンドポイント
https://livedesk-api.engagelab.com/api/v2/accounts/conversations/{conversation_id}/toggle_status
認証
詳細は、API Overview の認証方法に関する説明を参照してください。
リクエスト
リクエスト例
curl -X POST 'https://livedesk-api.engagelab.com/api/v2/accounts/conversations/{conversation_id}/toggle_status' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic base64(api_key:api_secret)' \
-d '{
"status": "resolved",
"snoozed_until": 1715000000
}'
curl -X POST 'https://livedesk-api.engagelab.com/api/v2/accounts/conversations/{conversation_id}/toggle_status' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic base64(api_key:api_secret)' \
-d '{
"status": "resolved",
"snoozed_until": 1715000000
}'
このコードブロックはフローティングウィンドウ内に表示されます
リクエストヘッダー
| Field | Type | Description |
|---|---|---|
| Authorization | string | 認証には Authorization: Basic base64(API Key:API Secret) を使用します。API キーページで API Key と API Secret を取得し、コロンで連結したうえで、結果を Base64 エンコードしてください。 |
| Content-Type | application/json | コンテンツタイプです。プレーンテキストメッセージには application/json を使用します。 |
パスパラメータ
| Field | Type | Required | Description |
|---|---|---|---|
| conversation_id | string | Yes | 会話 ID。 |
リクエストボディパラメータ
| Field | Type | Required | Description |
|---|---|---|---|
| status | string | Yes | 対象のステータス。下記の列挙値を参照してください。 |
| snoozed_until | integer | No | status=snoozed の場合にのみ有効です。UNIX タイムスタンプ(秒)。省略した場合、会話は無期限でスヌーズされます。 |
| sender_type | string | No | 内部のサーバー側識別専用です。呼び出し元が AgentBot で、現在のステータスが pending、対象ステータスが open の場合、bot_handoff! フローがトリガーされ、CONVERSATION_BOT_HANDOFF イベントがディスパッチされます。 |
status の列挙値
| Value | Meaning |
|---|---|
| open | 進行中 |
| resolved | 解決済み |
| pending | ボット/エージェント対応待ち |
| snoozed | スヌーズ中 |
| closed | クローズ済み(アーカイブ) |
状態遷移マトリクス(STATUS_TRANSITIONS)
| Current Status | Allowed Target Status |
|---|---|
| open | open, resolved, pending, snoozed |
| resolved | resolved, open, pending, snoozed, closed |
| pending | pending, open, resolved, snoozed |
| snoozed | snoozed, open, resolved, pending |
| closed | closed, open |
主な制約
closedに遷移できる前提ステータスはresolvedのみです:open、pending、snoozedから直接closedに設定することはできません。アーカイブする前に、まずresolvedへ遷移する必要があります。closedから戻せるのはopenのみです:アーカイブ済みの会話は、resolved、pending、snoozedなどの他のアクティブなステータスへ直接遷移できません。- 同じステータスの設定は冪等です:対象ステータスが現在のステータスと同じ場合、検証はスキップされ、そのまま成功が返されます。コールバックはトリガーされません。
- 検証は
validate :status_transition_allowed, if: :will_save_change_to_status?を通じて ActiveRecord のモデルレイヤーで実装されており、すべてのsave!、update!、およびstatus=+saveの経路に適用されます。
レスポンス
成功レスポンス
HTTP 200:
{
"meta": {},
"payload": {
"success": true,
"conversation_id": 45,
"current_status": "resolved",
"snoozed_until": null
}
}
{
"meta": {},
"payload": {
"success": true,
"conversation_id": 45,
"current_status": "resolved",
"snoozed_until": null
}
}
このコードブロックはフローティングウィンドウ内に表示されます
レスポンスパラメータ
| Field | Type | Description |
|---|---|---|
| success | boolean | save の戻り値です。ステータス更新が成功した場合は true です。 |
| conversation_id | integer | 会話の display_id(アカウント内で表示される ID)。 |
| current_status | string | 更新後の会話ステータス。 |
| snoozed_until | integer / null | 現在有効なスヌーズ期限のタイムスタンプ。ステータスが snoozed でない場合は常に null です。 |
エラーレスポンス
| HTTP Status Code | Trigger Condition |
|---|---|
| 401 | 未認証、または認証に失敗した場合 |
| 403 | 現在のユーザーに、その会話が属する受信トレイへのアクセス権限がない場合 |
| 404 | 現在のアカウント配下で、対応する display_id を持つ会話が見つからない場合 |
| 422 | status が有効な列挙値ではない、snoozed_until の解析に失敗した、または対象ステータスが STATUS_TRANSITIONS マトリクスに違反している場合 |
422 レスポンス構造
状態遷移マトリクスに違反している場合(モデルレイヤーの検証に由来し、RequestExceptionHandler によって full_messages としてレンダリングされます):
{
"message": "Status can't transition from open to closed",
"attributes": ["status"]
}
{
"message": "Status can't transition from open to closed",
"attributes": ["status"]
}
このコードブロックはフローティングウィンドウ内に表示されます
不明な status の列挙値(CustomExceptions::Conversation::InvalidStatus に由来):
{
"message": "Invalid conversation status: \"foo\" ('foo' is not a valid status)"
}
{
"message": "Invalid conversation status: \"foo\" ('foo' is not a valid status)"
}
このコードブロックはフローティングウィンドウ内に表示されます
無効な snoozed_until(CustomExceptions::Conversation::InvalidSnoozedUntil に由来):
{
"message": "Invalid snoozed_until: \"not-a-timestamp\" (invalid date)"
}
{
"message": "Invalid snoozed_until: \"not-a-timestamp\" (invalid date)"
}
このコードブロックはフローティングウィンドウ内に表示されます










