curl --request PUT \
--url https://api.nuvia.ai/v1/conversations/{id}/assign-owner \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"isToolCall": false,
"preserveWhoAnswering": false,
"rejectInactiveUser": true,
"webhookEventId": "<string>"
}
'import requests
url = "https://api.nuvia.ai/v1/conversations/{id}/assign-owner"
payload = {
"userId": "<string>",
"isToolCall": False,
"preserveWhoAnswering": False,
"rejectInactiveUser": True,
"webhookEventId": "<string>"
}
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({
userId: '<string>',
isToolCall: false,
preserveWhoAnswering: false,
rejectInactiveUser: true,
webhookEventId: '<string>'
})
};
fetch('https://api.nuvia.ai/v1/conversations/{id}/assign-owner', 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://api.nuvia.ai/v1/conversations/{id}/assign-owner",
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([
'userId' => '<string>',
'isToolCall' => false,
'preserveWhoAnswering' => false,
'rejectInactiveUser' => true,
'webhookEventId' => '<string>'
]),
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://api.nuvia.ai/v1/conversations/{id}/assign-owner"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\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://api.nuvia.ai/v1/conversations/{id}/assign-owner")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nuvia.ai/v1/conversations/{id}/assign-owner")
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 \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"last_activity_at": "<unknown>",
"status": "OPEN",
"who_answering": "AGENT",
"contact": "<unknown>",
"inbox": "<unknown>",
"company": "<unknown>",
"_id": "<string>",
"additional_attributes": "<unknown>",
"agent_last_activity_at": "<unknown>",
"contact_last_activity_at": "<unknown>",
"allow_send_messages_at": "<unknown>",
"priority": 4,
"agent": "<unknown>",
"current_step": "<unknown>",
"user": "<unknown>",
"requires_attention": {
"type": "HUMAN_HANDOFF",
"requested_at": "<unknown>"
},
"referral": "<unknown>",
"createdAt": "<unknown>",
"updatedAt": "<unknown>",
"resolved_count": 123
}Atribuir dono à conversa
Define o dono (responsável) da conversa vinculando um usuário. NÃO altera quem está respondendo (who_answering) nem coloca a conversa na fila de atendimento humano.
curl --request PUT \
--url https://api.nuvia.ai/v1/conversations/{id}/assign-owner \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"isToolCall": false,
"preserveWhoAnswering": false,
"rejectInactiveUser": true,
"webhookEventId": "<string>"
}
'import requests
url = "https://api.nuvia.ai/v1/conversations/{id}/assign-owner"
payload = {
"userId": "<string>",
"isToolCall": False,
"preserveWhoAnswering": False,
"rejectInactiveUser": True,
"webhookEventId": "<string>"
}
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({
userId: '<string>',
isToolCall: false,
preserveWhoAnswering: false,
rejectInactiveUser: true,
webhookEventId: '<string>'
})
};
fetch('https://api.nuvia.ai/v1/conversations/{id}/assign-owner', 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://api.nuvia.ai/v1/conversations/{id}/assign-owner",
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([
'userId' => '<string>',
'isToolCall' => false,
'preserveWhoAnswering' => false,
'rejectInactiveUser' => true,
'webhookEventId' => '<string>'
]),
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://api.nuvia.ai/v1/conversations/{id}/assign-owner"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\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://api.nuvia.ai/v1/conversations/{id}/assign-owner")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nuvia.ai/v1/conversations/{id}/assign-owner")
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 \"userId\": \"<string>\",\n \"isToolCall\": false,\n \"preserveWhoAnswering\": false,\n \"rejectInactiveUser\": true,\n \"webhookEventId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"last_activity_at": "<unknown>",
"status": "OPEN",
"who_answering": "AGENT",
"contact": "<unknown>",
"inbox": "<unknown>",
"company": "<unknown>",
"_id": "<string>",
"additional_attributes": "<unknown>",
"agent_last_activity_at": "<unknown>",
"contact_last_activity_at": "<unknown>",
"allow_send_messages_at": "<unknown>",
"priority": 4,
"agent": "<unknown>",
"current_step": "<unknown>",
"user": "<unknown>",
"requires_attention": {
"type": "HUMAN_HANDOFF",
"requested_at": "<unknown>"
},
"referral": "<unknown>",
"createdAt": "<unknown>",
"updatedAt": "<unknown>",
"resolved_count": 123
}Autorizações
Token JWT de autenticação
Cabeçalhos
Identificador da empresa-alvo. Obrigatório apenas para API Keys globais (type=global). Ignorado para API Keys de empresa e usuários humanos.
Parâmetros de caminho
ID da conversa
Corpo
ID do usuário (atendente) a ser atribuído
Se é uma chamada de ferramenta (tool call)
Se true, mantém o who_answering atual (não força HUMAN). Usado na sincronização de owner HubSpot.
Origem da atribuição. Campo puramente de observabilidade, propagado apenas para logs.
ai_tool_assign_user, ai_tool_assign_team, ai_tool_distribute_owner, ai_tool_assign_linked_user, webhook_hubspot_owner_sync, campaign_step_config, campaign_list_owner_reconcile, ui_user, ui_admin, user_offboard_reassign, manual_template_send, internal Se true, atribuir a um usuário que não está ACTIVE devolve erro em vez de ignorar a atribuição. Ligado só na rota do operador, onde existe alguém para ler a mensagem; todo caminho automático (tool, webhook de CRM, campanha) usa o padrão false.
eventId do webhook HubSpot quando a atribuição é disparada via WebhookOwnerSyncService. Propagado apenas para logs.
Resposta
Dono atribuído com sucesso
Data da última atividade
Status da conversa
OPEN, RESOLVED Quem está respondendo (AGENT/HUMAN)
AGENT, HUMAN, UNASSIGNED Contato da conversa
Inbox da conversa
Empresa da conversa
ID da conversa
Atributos adicionais da conversa
Data da última atividade do agente
Data da última atividade do contato
Data permitida para enviar mensagens
Prioridade da conversa
4, 3, 2, 1 Agente atribuído à conversa
Passo atual do fluxo do agente
Usuário atribuído à conversa
Atenção necessária
Show child attributes
Show child attributes
Dados de referral da conversa
Data de criação da conversa
Data de atualização da conversa
Quantidade de conversas resolvidas do contato (apenas quando agrupado)