curl --request PATCH \
--url https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Support QA Agent v2",
"strictness_level": 80,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"weight": 30
},
{
"uuid": "4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b",
"name": "Compliance",
"weight": 40
},
{
"name": "Product Knowledge",
"weight": 30,
"description": "Accuracy of technical answers",
"is_custom": true
}
]
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}"
payload = {
"name": "Support QA Agent v2",
"strictness_level": 80,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"weight": 30
},
{
"uuid": "4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b",
"name": "Compliance",
"weight": 40
},
{
"name": "Product Knowledge",
"weight": 30,
"description": "Accuracy of technical answers",
"is_custom": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Support QA Agent v2',
strictness_level: 80,
skills: [
{uuid: '9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a', name: 'Empathy', weight: 30},
{uuid: '4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b', name: 'Compliance', weight: 40},
{
name: 'Product Knowledge',
weight: 30,
description: 'Accuracy of technical answers',
is_custom: true
}
]
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}', 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/qa-agents/{uuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Support QA Agent v2',
'strictness_level' => 80,
'skills' => [
[
'uuid' => '9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a',
'name' => 'Empathy',
'weight' => 30
],
[
'uuid' => '4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b',
'name' => 'Compliance',
'weight' => 40
],
[
'name' => 'Product Knowledge',
'weight' => 30,
'description' => 'Accuracy of technical answers',
'is_custom' => true
]
]
]),
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/qa-agents/{uuid}"
payload := strings.NewReader("{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "QA agent updated successfully",
"data": {
"uuid": "7e1c9b3a-5d2f-4c8e-b6a1-0f9d8c7b6a5e",
"name": "Support QA Agent",
"description": "Evaluates support conversations for empathy and compliance",
"evaluates_agent_type": "human",
"is_active": true,
"is_default": true,
"evaluation_model": "advanced",
"strictness_level": 70,
"confidence_threshold": 85,
"auto_fail_threshold": 3,
"language": "English",
"custom_instructions": "Focus on product knowledge when evaluating technical support calls.",
"automatic_scoring": true,
"sentiment_analysis": true,
"compliance_checking": true,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"description": "Understanding and acknowledging customer concerns",
"weight": 20,
"max_score": 10,
"ai_evaluation_prompt": "Evaluate whether the agent acknowledged the customer's feelings.",
"positive_items": [
{
"name": "Used the customer's name",
"points": 5
}
],
"penalty_items": [
{
"name": "Interrupted the customer",
"penalty_points": -5,
"is_auto_fail": false
}
],
"order": 2,
"is_custom": false
}
],
"total_weight": 100,
"weights_balanced": true,
"created_at": "2026-06-04T10:15:30+00:00",
"updated_at": "2026-06-04T10:15:30+00:00"
}
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}Update a QA agent
Updates a QA agent — only the fields you send are changed. When you include skills, the list replaces the whole scorecard: include a skill’s uuid to keep and update it, omit the uuid to add a new skill, and any skill you leave out is removed. Weights must total 100%. Note: the current default agent stays default until you set another one as default.
curl --request PATCH \
--url https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Support QA Agent v2",
"strictness_level": 80,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"weight": 30
},
{
"uuid": "4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b",
"name": "Compliance",
"weight": 40
},
{
"name": "Product Knowledge",
"weight": 30,
"description": "Accuracy of technical answers",
"is_custom": true
}
]
}
'import requests
url = "https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}"
payload = {
"name": "Support QA Agent v2",
"strictness_level": 80,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"weight": 30
},
{
"uuid": "4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b",
"name": "Compliance",
"weight": 40
},
{
"name": "Product Knowledge",
"weight": 30,
"description": "Accuracy of technical answers",
"is_custom": True
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Support QA Agent v2',
strictness_level: 80,
skills: [
{uuid: '9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a', name: 'Empathy', weight: 30},
{uuid: '4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b', name: 'Compliance', weight: 40},
{
name: 'Product Knowledge',
weight: 30,
description: 'Accuracy of technical answers',
is_custom: true
}
]
})
};
fetch('https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}', 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/qa-agents/{uuid}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Support QA Agent v2',
'strictness_level' => 80,
'skills' => [
[
'uuid' => '9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a',
'name' => 'Empathy',
'weight' => 30
],
[
'uuid' => '4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b',
'name' => 'Compliance',
'weight' => 40
],
[
'name' => 'Product Knowledge',
'weight' => 30,
'description' => 'Accuracy of technical answers',
'is_custom' => true
]
]
]),
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/qa-agents/{uuid}"
payload := strings.NewReader("{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.mihu.ai/api/v1/qa-agents/{uuid}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Support QA Agent v2\",\n \"strictness_level\": 80,\n \"skills\": [\n {\n \"uuid\": \"9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a\",\n \"name\": \"Empathy\",\n \"weight\": 30\n },\n {\n \"uuid\": \"4b8e2d11-7f3a-4c5e-8d9b-1a2c3e4f5a6b\",\n \"name\": \"Compliance\",\n \"weight\": 40\n },\n {\n \"name\": \"Product Knowledge\",\n \"weight\": 30,\n \"description\": \"Accuracy of technical answers\",\n \"is_custom\": true\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "QA agent updated successfully",
"data": {
"uuid": "7e1c9b3a-5d2f-4c8e-b6a1-0f9d8c7b6a5e",
"name": "Support QA Agent",
"description": "Evaluates support conversations for empathy and compliance",
"evaluates_agent_type": "human",
"is_active": true,
"is_default": true,
"evaluation_model": "advanced",
"strictness_level": 70,
"confidence_threshold": 85,
"auto_fail_threshold": 3,
"language": "English",
"custom_instructions": "Focus on product knowledge when evaluating technical support calls.",
"automatic_scoring": true,
"sentiment_analysis": true,
"compliance_checking": true,
"skills": [
{
"uuid": "9c2f5a44-1b7e-4f4a-9a6c-3d2f8e7b1c0a",
"name": "Empathy",
"description": "Understanding and acknowledging customer concerns",
"weight": 20,
"max_score": 10,
"ai_evaluation_prompt": "Evaluate whether the agent acknowledged the customer's feelings.",
"positive_items": [
{
"name": "Used the customer's name",
"points": 5
}
],
"penalty_items": [
{
"name": "Interrupted the customer",
"penalty_points": -5,
"is_auto_fail": false
}
],
"order": 2,
"is_custom": false
}
],
"total_weight": 100,
"weights_balanced": true,
"created_at": "2026-06-04T10:15:30+00:00",
"updated_at": "2026-06-04T10:15:30+00:00"
}
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}{
"success": false,
"message": "Agent not found",
"data": []
}Authorizations
Use a Bearer token to access these API endpoints. Example: "Bearer {your-token}"
Path Parameters
The QA agent's uuid.
Body
Create/update payload. On update only the fields you send are changed.
255"Support QA Agent"
"Evaluates support conversations for empathy and compliance"
Who this QA agent evaluates: human agents, AI agents, or both.
human, ai, both "human"
true
Send true to make this the default evaluator. To move the default away from an agent, set another one as default.
false
50"advanced"
How strictly conversations are scored. Higher = harsher.
0 <= x <= 10070
Minimum AI confidence (%) for a score to be applied.
0 <= x <= 10085
Number of critical violations after which an evaluation fails automatically.
0 <= x <= 103
Language for evaluation reports and feedback.
50"English"
Extra guidance applied to every evaluation.
"Focus on product knowledge when evaluating technical support calls."
true
true
true
The full scorecard. Sending it replaces the existing skills; weights must total 100%. Leave it out on create to start with the standard 5-skill scorecard.
1Show child attributes
Show child attributes