Skip to content

Replace the QA rubric

PUT
/qa/rubric
import MoreVoice from "@morevoice/sdk";
const mv = new MoreVoice(); // MOREVOICE_API_KEY from the environment
const qaRubric = await mv.qa.updateRubric({
items: [
{
key: "discovery",
label: "Discovery",
weight: 60,
},
{
key: "closing",
label: "Next step",
type: "boolean",
weight: 40,
},
],
pass_threshold: 75,
});
console.log(qaRubric);

Replaces the organisation’s rubric. Weights are relative, on one 0–100 scale (only the ratios count). Calls scored from now on use it; existing scorecards keep the rubric they were scored with.

Try it in the API playground with a test-mode key.

MoreVoice-Version
string
/^\d{4}-\d{2}-\d{2}$/

The API version to use for this request. Defaults to the version the API key is pinned to.

Example
2026-11-01
Media typeapplication/json

The whole rubric: it replaces the stored one. New calls are scored against it.

object
items
required

The items, in order; keys must be unique and at least one item needs a weight above 0.

Array<object>
>= 1 items <= 50 items
object
critical

Default false.

boolean
description

What a good answer looks like (the scorer reads it).

string
<= 2000 characters
key
required

Your stable key for the item: letters, digits, - and _ (≤ 40).

string
/^[a-z0-9_-]{1,40}$/
label
required
string
>= 1 characters <= 200 characters
type

Default scale.

string
Allowed values: scale boolean
weight

Default 1. Relative importance on one 0–100 scale; only the ratios count.

number
<= 100
name

Default: “Default QA rubric”.

string
>= 1 characters <= 200 characters
pass_threshold

Default 70.

number
<= 100
Example
{
"items": [
{
"key": "discovery",
"label": "Discovery",
"weight": 60
},
{
"key": "closing",
"label": "Next step",
"type": "boolean",
"weight": 40
}
],
"pass_threshold": 75
}

OK

Media typeapplication/json

Your organisation’s QA rubric. Calls with a copilot profile that has its own rubric are scored against that one.

object
builtin
required

True: the built-in rubric (you have not saved your own).

boolean
items
required
Array<object>
object
critical
required

A compliance item: scoring 2 or less fails the call whatever the total.

boolean
description
required

What a good answer looks like (the scorer reads it).

string
<= 2000 characters
key
required

Your stable key for the item: letters, digits, - and _ (≤ 40).

string
/^[a-z0-9_-]{1,40}$/
label
required
string
>= 1 characters <= 200 characters
type
required

scale: 0–5; boolean: done (5) or not (0).

string
Allowed values: scale boolean
weight
required

Relative importance on one 0–100 scale; only the ratios count (60 and 40 weigh like 3 and 2).

number
<= 100
livemode
required

true in live mode, false in test mode.

boolean
name
required
string
object
required
string
Allowed value: qa_rubric
pass_threshold
required

A call passes at this score (0–100) or above, with no critical item failed.

number
<= 100
Example
{
"builtin": false,
"items": [
{
"critical": true,
"description": "Says the call is recorded before any commitment.",
"key": "disclosure",
"label": "Disclosure",
"type": "scale",
"weight": 30
},
{
"critical": false,
"description": "Open questions before offering a solution.",
"key": "discovery",
"label": "Discovery",
"type": "scale",
"weight": 40
},
{
"critical": false,
"description": "Agrees a dated next step.",
"key": "closing",
"label": "Next step",
"type": "boolean",
"weight": 30
}
],
"livemode": true,
"name": "Sales and service",
"object": "qa_rubric",
"pass_threshold": 70
}

The request is invalid: a parameter is missing, malformed or unknown, or the version header is unknown.

Media typeapplication/json

Every /v1 error.

object
error
required
object
code
required

A stable, machine-readable code from the error-code catalogue.

string
details

Structured context, e.g. required_scope or the compliance verdict.

object
key
additional properties
doc_url
required

A link to the documentation of this code.

string
message
required

A human-readable explanation. Do not parse it.

string
param

The request parameter the error relates to, e.g. to or metadata[order_id].

string
request_id
required

The X-Request-Id of this request. Quote it when you contact support.

string
type
required

The category of the error.

string
Allowed values: invalid_request_error authentication_error permission_error not_found conflict rate_limit_error compliance_error idempotency_error api_error
Example
{
"error": {
"code": "parameter_missing",
"doc_url": "https://docs.morevoice.ai/api/errors#parameter-missing",
"message": "Missing required parameter: to.",
"param": "to",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "invalid_request_error"
}
}
X-Request-Id
string

The request’s ID (req_…). Quote it when you contact support.

No valid API key was sent.

Media typeapplication/json

Every /v1 error.

object
error
required
object
code
required

A stable, machine-readable code from the error-code catalogue.

string
details

Structured context, e.g. required_scope or the compliance verdict.

object
key
additional properties
doc_url
required

A link to the documentation of this code.

string
message
required

A human-readable explanation. Do not parse it.

string
param

The request parameter the error relates to, e.g. to or metadata[order_id].

string
request_id
required

The X-Request-Id of this request. Quote it when you contact support.

string
type
required

The category of the error.

string
Allowed values: invalid_request_error authentication_error permission_error not_found conflict rate_limit_error compliance_error idempotency_error api_error
Example
{
"error": {
"code": "invalid_api_key",
"doc_url": "https://docs.morevoice.ai/api/errors#invalid-api-key",
"message": "Invalid API key.",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "authentication_error"
}
}
X-Request-Id
string

The request’s ID (req_…). Quote it when you contact support.

The key may not do this (a missing scope, a plan limit, or a compliance block).

Media typeapplication/json

Every /v1 error.

object
error
required
object
code
required

A stable, machine-readable code from the error-code catalogue.

string
details

Structured context, e.g. required_scope or the compliance verdict.

object
key
additional properties
doc_url
required

A link to the documentation of this code.

string
message
required

A human-readable explanation. Do not parse it.

string
param

The request parameter the error relates to, e.g. to or metadata[order_id].

string
request_id
required

The X-Request-Id of this request. Quote it when you contact support.

string
type
required

The category of the error.

string
Allowed values: invalid_request_error authentication_error permission_error not_found conflict rate_limit_error compliance_error idempotency_error api_error
Example
{
"error": {
"code": "missing_scope",
"doc_url": "https://docs.morevoice.ai/api/errors#missing-scope",
"message": "This API key lacks the calls:write scope.",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "permission_error"
}
}
X-Request-Id
string

The request’s ID (req_…). Quote it when you contact support.

Too many requests, or no call capacity right now. Retry after the Retry-After delay.

Media typeapplication/json

Every /v1 error.

object
error
required
object
code
required

A stable, machine-readable code from the error-code catalogue.

string
details

Structured context, e.g. required_scope or the compliance verdict.

object
key
additional properties
doc_url
required

A link to the documentation of this code.

string
message
required

A human-readable explanation. Do not parse it.

string
param

The request parameter the error relates to, e.g. to or metadata[order_id].

string
request_id
required

The X-Request-Id of this request. Quote it when you contact support.

string
type
required

The category of the error.

string
Allowed values: invalid_request_error authentication_error permission_error not_found conflict rate_limit_error compliance_error idempotency_error api_error
Example
{
"error": {
"code": "rate_limited",
"doc_url": "https://docs.morevoice.ai/api/errors#rate-limited",
"message": "Too many requests. Retry after 1 second.",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "rate_limit_error"
}
}
Retry-After
integer

Seconds to wait before retrying.

X-Request-Id
string

The request’s ID (req_…). Quote it when you contact support.

Something went wrong on MoreVoice’s side. Retry with the same Idempotency-Key.

Media typeapplication/json

Every /v1 error.

object
error
required
object
code
required

A stable, machine-readable code from the error-code catalogue.

string
details

Structured context, e.g. required_scope or the compliance verdict.

object
key
additional properties
doc_url
required

A link to the documentation of this code.

string
message
required

A human-readable explanation. Do not parse it.

string
param

The request parameter the error relates to, e.g. to or metadata[order_id].

string
request_id
required

The X-Request-Id of this request. Quote it when you contact support.

string
type
required

The category of the error.

string
Allowed values: invalid_request_error authentication_error permission_error not_found conflict rate_limit_error compliance_error idempotency_error api_error
Example
{
"error": {
"code": "internal_error",
"doc_url": "https://docs.morevoice.ai/api/errors#internal-error",
"message": "Something went wrong on MoreVoice's side.",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "api_error"
}
}
X-Request-Id
string

The request’s ID (req_…). Quote it when you contact support.