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
}Asignar propietario a la conversación
Define el propietario (responsable) de la conversación vinculando un usuario. NO modifica quién está respondiendo (who_answering) ni coloca la conversación en la cola de atención humana.
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
}Autorizaciones
Token JWT de autenticação
Encabezados
Identificador de la empresa objetivo. Obligatorio solo para API keys globales (type=global). Se ignora para API keys de empresa y usuarios humanos.
Parámetros de ruta
ID de la conversación
Cuerpo
ID del usuario (agente humano) que se va a asignar
Si es una llamada a herramienta (tool call)
Si es true, mantiene el who_answering actual (no fuerza HUMAN). Usado en la sincronización de owner de HubSpot.
Origen de la asignación. Campo puramente de observabilidad, propagado solo 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 Si es true, asignar a un usuario que no está ACTIVE devuelve error en lugar de ignorar la asignación. Activado solo en la ruta del operador, donde hay alguien para leer el mensaje; todo camino automático (tool, webhook de CRM, campaña) usa el valor predeterminado false.
eventId del webhook de HubSpot cuando la asignación se dispara mediante WebhookOwnerSyncService. Se propaga solo para logs.
Respuesta
Propietario asignado correctamente
Fecha de la última actividad
Estado de la conversación
OPEN, RESOLVED Quién está respondiendo (AGENT/HUMAN)
AGENT, HUMAN, UNASSIGNED Contacto de la conversación
Inbox de la conversación
Empresa de la conversación
ID de la conversación
Atributos adicionales de la conversación
Fecha de la última actividad del agente
Fecha de la última actividad del contacto
Fecha permitida para enviar mensajes
Prioridad de la conversación
4, 3, 2, 1 Agente asignado a la conversación
Paso actual del flujo del agente
Usuario asignado a la conversación
Atención necesaria
Show child attributes
Show child attributes
Datos de referral de la conversación
Fecha de creación de la conversación
Fecha de actualización de la conversación
Cantidad de conversaciones resueltas del contacto (solo cuando está agrupado)