curl --request PUT \
--url https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assignee": null
}
'import requests
url = "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment"
payload = { "assignee": None }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({assignee: null})
};
fetch('https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'assignee' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment"
payload := strings.NewReader("{\n \"assignee\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assignee\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assignee\": null\n}"
response = http.request(request)
puts response.read_body{
"conversation": {
"id": "<string>",
"status": "open",
"priority": "low",
"pendingOn": "<string>",
"pendingReason": "<string>",
"assignee": {
"type": "agent",
"id": "<string>"
},
"teamId": "<string>"
}
}{
"code": "BadRequest",
"message": "Invalid fields, unknown properties, or a disallowed status transition."
}{
"code": "Unauthenticated",
"message": "The API key is missing, invalid, or expired."
}{
"code": "PermissionDenied",
"message": "The API key does not authorize this tenant or operation."
}{
"code": "NotFound",
"message": "The customer Conversation or active assignee is unavailable in this tenant."
}{
"code": "Conflict",
"message": "The Conversation is merged/Closed, a lock is held, or lifecycle/realtime ownership constraints reject the operation."
}{
"code": "PayloadTooLarge",
"message": "The JSON body exceeds 32768 bytes."
}{
"code": "RateLimitExceeded",
"message": "The request exceeds the API rate limit."
}{
"code": "BadGateway",
"message": "The downstream request failed; the write may already have completed."
}{
"code": "ServiceUnavailable",
"message": "A required service is unavailable; the write may already have completed."
}{
"code": "GatewayTimeout",
"message": "The request timed out; the write may already have completed."
}Assign a conversation
Assign an exact active tenant agent/team or clear assignment using null. The Conversation must be non-closed. Existing team association and realtime ownership restrictions apply. This does not take over, accept an offer, or connect an agent to a call. Requires a tenant API key with cxm:conversations.write or an existing broader write scope. The complete JSON body must not exceed 32768 bytes. Each invocation executes independently, with no request deduplication, version precondition, preparation step, or retry protection. A timeout may follow a successful commit. Merged and non-customer records are rejected.
curl --request PUT \
--url https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"assignee": null
}
'import requests
url = "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment"
payload = { "assignee": None }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({assignee: null})
};
fetch('https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'assignee' => null
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment"
payload := strings.NewReader("{\n \"assignee\": null\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"assignee\": null\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.crescendo.ai/api/v1/cxm/tenants/{tenantId}/conversations/{conversationId}/assignment")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"assignee\": null\n}"
response = http.request(request)
puts response.read_body{
"conversation": {
"id": "<string>",
"status": "open",
"priority": "low",
"pendingOn": "<string>",
"pendingReason": "<string>",
"assignee": {
"type": "agent",
"id": "<string>"
},
"teamId": "<string>"
}
}{
"code": "BadRequest",
"message": "Invalid fields, unknown properties, or a disallowed status transition."
}{
"code": "Unauthenticated",
"message": "The API key is missing, invalid, or expired."
}{
"code": "PermissionDenied",
"message": "The API key does not authorize this tenant or operation."
}{
"code": "NotFound",
"message": "The customer Conversation or active assignee is unavailable in this tenant."
}{
"code": "Conflict",
"message": "The Conversation is merged/Closed, a lock is held, or lifecycle/realtime ownership constraints reject the operation."
}{
"code": "PayloadTooLarge",
"message": "The JSON body exceeds 32768 bytes."
}{
"code": "RateLimitExceeded",
"message": "The request exceeds the API rate limit."
}{
"code": "BadGateway",
"message": "The downstream request failed; the write may already have completed."
}{
"code": "ServiceUnavailable",
"message": "A required service is unavailable; the write may already have completed."
}{
"code": "GatewayTimeout",
"message": "The request timed out; the write may already have completed."
}Authorizations
Tenant API key with cxm:conversations.write, cxm:conversations.*, cxm:write, or cxm:* scope. Keep it in a trusted backend; do not expose it in browser code.
Path Parameters
Exact tenant-authorized ID without path separators.
1 - 128Exact tenant-authorized ID without path separators.
1 - 512Body
Exact active tenant agent/team ID, or null to clear assignment. API keys cannot use me.
Show child attributes
Show child attributes
Response
Committed operation result; notification delivery is not implied.
Show child attributes
Show child attributes

