Skip to main content

Bulk Conversation Actions

Act on up to 100 conversations in one request. Each bulk endpoint does exactly what its single-conversation counterpart does, for every conversation in the list, and follows the same permissions and access rules.

ActionEndpointRequired scopeSingle-conversation equivalent
ClosePOST /api/v1/conversations/bulk-closeconversations:updatePOST /api/v1/conversations/{conversation_id}/close
ReopenPOST /api/v1/conversations/bulk-reopenconversations:updatePOST /api/v1/conversations/{conversation_id}/reopen
Assign / unassignPOST /api/v1/conversations/bulk-assignconversations:updatePATCH /api/v1/conversations/{conversation_id} with assigned_user_id
Add tagsPOST /api/v1/conversations/bulk-tagconversations:updatePOST /api/v1/conversations/{conversation_id}/tags/{tag_id}
Delete permanentlyPOST /api/v1/conversations/bulk-deleteconversations:deleteDELETE /api/v1/conversations/{conversation_id}

Request and response​

Every bulk endpoint takes a conversation_ids array with 1 to 100 IDs (duplicates are ignored) and returns the same response:

{
"success_count": 8,
"failed_count": 2,
"failed_ids": ["conv_abc123", "conv_def456"]
}

A conversation ends up in failed_ids when:

  • it does not exist in your workspace, or you cannot access it (for example because of a Custom Inbox restriction). Both cases look the same, so the response never reveals whether a conversation exists;
  • it is assigned to another member while your workspace does not let members act on each other's conversations (admins and owners are not affected);
  • it could not be changed right now. Retry those IDs.

The call itself succeeds (200 OK) when some or all conversations fail. Requests with more than 100 IDs are rejected with 422; split larger selections into batches.

Close​

curl -X POST "https://api.sendseven.com/api/v1/conversations/bulk-close" \
-H "Authorization: Bearer $SENDSEVEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversation_ids": ["conv_abc123", "conv_def456"],
"reason": "spam",
"summarize": false
}'
FieldTypeDescription
conversation_idsarray of strings1 to 100 conversation IDs.
reasonstring, optionalUp to 500 characters. Saved as an internal note on each closed conversation.
summarizeboolean, optionaltrue asks for an AI summary of every conversation this call closes. Omitted or false: no summary, which suits spam and duplicates.

summarize: true behaves like summarize on the single close endpoint. A summary is queued for each conversation this call closes when your workspace's summarize on close setting is Always, or Ask (your true is the answer). With Never, or on a plan without AI summaries, the conversations are still closed, without a summary. Summaries are generated in the background, so they appear on the conversations a little later.

Every conversation this call closes gets the same follow-up as a single close:

  • the conversation.closed webhook fires once per conversation, with closed_by identifying who made the call;
  • flows that start on Conversation closed run for each one, and flows still running in those conversations are stopped;
  • an open live chat session for the conversation is ended;
  • your workspace's automatic transcript export (PDF, ZIP or both) runs for each conversation, and if HubSpot is connected with transcripts turned on, the transcript is attached to the HubSpot contact. HubSpot uploads from one bulk close run a few at a time in the background, so they can take a few minutes to appear for a large batch.

Conversations that are already closed count as successful and fire nothing again: no webhook, no flow trigger, no summary and no export.

Reopen​

curl -X POST "https://api.sendseven.com/api/v1/conversations/bulk-reopen" \
-H "Authorization: Bearer $SENDSEVEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"conversation_ids": ["conv_abc123", "conv_def456"]}'

Each closed conversation is reopened: it goes back to assigned when it has an assignee, otherwise to open, and the conversation.reopened webhook fires. Conversations that are already open count as successful and are left unchanged.

Assign or unassign​

curl -X POST "https://api.sendseven.com/api/v1/conversations/bulk-assign" \
-H "Authorization: Bearer $SENDSEVEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversation_ids": ["conv_abc123", "conv_def456"],
"user_id": "user_789"
}'
FieldTypeDescription
conversation_idsarray of strings1 to 100 conversation IDs.
user_idstring or null, requiredThe workspace member to assign the conversations to. Send null to unassign them.

The new assignee is notified (not when you assign conversations to yourself) and the conversation.assigned webhook fires for each changed conversation. Conversations already assigned to that member, or already unassigned, count as successful and are left unchanged, so nobody is notified twice.

Assigning conversations to yourself is always allowed. When your workspace does not let members act on each other's conversations, only admins and owners can reassign or unassign a conversation that belongs to another member.

400 Bad Request is returned, and nothing is changed, when user_id is not an active member of your workspace.

Add tags​

curl -X POST "https://api.sendseven.com/api/v1/conversations/bulk-tag" \
-H "Authorization: Bearer $SENDSEVEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversation_ids": ["conv_abc123", "conv_def456"],
"tag_ids": ["tag_vip", "tag_billing"]
}'

Adds every tag in tag_ids (1 to 20) to every conversation. These are conversation tags, the same tags the conversation header shows and the conversation list filters on, not contact tags. Tags that a conversation already has stay as they are, and no tag is ever removed. To remove a tag, use DELETE /api/v1/conversations/{conversation_id}/tags/{tag_id}.

422 Unprocessable Entity is returned, and nothing is changed, when a tag_ids entry is not a tag of your workspace. Create tags first with the Tags API.

Delete permanently​

curl -X POST "https://api.sendseven.com/api/v1/conversations/bulk-delete" \
-H "Authorization: Bearer $SENDSEVEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"conversation_ids": ["conv_abc123", "conv_def456"]}'
Deletion is permanent

Deleted conversations cannot be restored. There is no trash or undo.

Each conversation is deleted exactly as Delete a Conversation describes: its messages, email messages, attachments, notes, conversation tags, drafts and flow runs are removed, the contacts are kept, and usage already sent stays on your invoice. Every delete is logged and appears as a conversation_deleted event in the contact's history, and connected clients receive a conversation_deleted WebSocket event for each deleted conversation.

This endpoint requires conversations:delete, which by default only the Owner and Admin roles hold.

Errors​

StatusMeaning
400 Bad Requestbulk-assign only: user_id is not an active member of your workspace.
403 ForbiddenYour token or role is missing the required scope.
422 Unprocessable EntityInvalid body: no IDs, more than 100 IDs, user_id missing on bulk-assign, or (on bulk-tag) a tag that is not in your workspace or more than 20 tags.