curl --request PUT \
--url https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"queue_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "Billing question — over to Finance"
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer"
payload = {
"queue_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "Billing question — over to Finance"
}
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({
queue_uuid: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
note: 'Billing question — over to Finance'
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer', 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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer",
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([
'queue_uuid' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'note' => 'Billing question — over to Finance'
]),
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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer"
payload := strings.NewReader("{\n \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer")
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 \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Conversation transferred",
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Support"
}
}
}Route a conversation to another queue
Moves the conversation to a different queue — the team that should carry it from here.
When to use it. The operator picks a queue in the transfer dialog: wrong team, needs a specialist, escalating out of hours. The customer sees nothing; only who is responsible changes.
What it does not do. It does not change the number the customer writes to, and it does not change the AI agent — that follows the number, not the queue. It also releases any individual assignee (assigned_to), because the conversation now belongs to a team rather than a person.
It sticks. The queue a conversation arrived on is decided by its number, but a transfer overrides that for the rest of the conversation: the next inbound message will not pull it back. Only moving the number itself to another queue in the designer, or the conversation closing, resets that.
The note is optional and, when given, is recorded in the thread as a system line so the receiving team can see why it arrived.
Who can call it. A workspace API token, or a per-user JWT holding loop.conversations.assign. JWTs are limited to conversations of their active queues (404 otherwise), but may transfer INTO any queue — handing work to another team is the point.
curl --request PUT \
--url https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"queue_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "Billing question — over to Finance"
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer"
payload = {
"queue_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"note": "Billing question — over to Finance"
}
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({
queue_uuid: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
note: 'Billing question — over to Finance'
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer', 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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer",
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([
'queue_uuid' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'note' => 'Billing question — over to Finance'
]),
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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer"
payload := strings.NewReader("{\n \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\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://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/conversations/{uuid}/transfer")
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 \"queue_uuid\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"note\": \"Billing question — over to Finance\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Conversation transferred",
"data": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue": {
"uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Support"
}
}
}Authorizations
Use a Bearer token to access these API endpoints. Example: "Bearer {your-token}"