Skip to content

Duplicate an assistant

POST
/assistants/{id}/duplicate
import { createClient, createResources } from "@morevoice/sdk";
const mv = createResources({
client: createClient({ baseUrl: "https://api.morevoice.ai/v1", auth: process.env.MOREVOICE_API_KEY }),
});
const assistant = await mv.assistants.duplicate("asst_ONCFICZKnGVk36Wx4t7ADJ", {
name: "Clinic receptionist (evening)",
});
console.log(assistant);

Creates a copy with the same configuration, tools (including their stored headers) and metadata.

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

id
required
string
<= 200 characters /^asst_[0-9A-Za-z]+$/

A assistant ID (asst_…).

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
Idempotency-Key
string
>= 1 characters <= 255 characters

A unique key (for example a UUID) that makes this request safe to retry: for 24 hours, a retry with the same key and parameters returns the first response instead of acting twice.

Example
5f0c1e8a-7b2d-4c3e-9f1a-2b6d8e4c0a17
Media typeapplication/json
object
name

The copy’s name (default: the original’s name + “ (עותק)“).

string
>= 1 characters <= 120 characters
Example
{
"name": "Clinic receptionist (evening)"
}

The copy.

Media typeapplication/json

An AI voice assistant: what it says and knows, how it sounds and listens, and the tools it can use. Assistants are shared by live and test mode.

object
advanced
required

Pipeline tuning. The defaults suit most assistants.

object
expression_tags
required

The vocal events the model may use when voice.expressions is on.

Array<string>
idle
required
object
max_messages
required

How many idle messages before giving up.

integer
>= -9007199254740991 <= 9007199254740991
messages
required

Said in turn when the caller is silent.

Array<string>
timeout_seconds
required

Silence before an idle message.

number
intelligent_turn_taking
required

Semantic end-of-turn detection instead of fixed silence delays.

boolean
latency
required
object
acknowledgement_after_ms
required

Delay before a filler.

integer
>= -9007199254740991 <= 9007199254740991
acknowledgement_phrases
required

The fillers.

Array<string>
acknowledgements
required

Play a short filler if the answer is not audible yet.

boolean
early_start
required

Start preparing the answer during the caller’s pause.

boolean
early_start_ms
required

Pause after which the early answer starts.

integer
>= -9007199254740991 <= 9007199254740991
first_chunk_max_words
required

The longest first spoken chunk without punctuation.

integer
>= -9007199254740991 <= 9007199254740991
llm_routing
required
object
complex_model
required

The model for everything else (null: llm.model).

string | null
mode
required

auto: simple turns go to simple_model.

string
Allowed values: off auto
simple_model
required

The model for simple turns.

string
sticky_turns
required

Turns that stay on the complex model after an escalation.

integer
>= -9007199254740991 <= 9007199254740991
max_endpoint_delay_ms
required

With intelligent turn taking: the longest wait after speech before the turn ends.

integer
>= -9007199254740991 <= 9007199254740991
silence_timeout_seconds
required

End the call after this much silence.

number
start_speaking_plan
required
object
on_no_punctuation_seconds
required

Wait after a transcript without final punctuation.

number
on_number_seconds
required

Wait after a transcript that ends with a number (the caller may be dictating).

number
on_punctuation_seconds
required

Wait after a transcript that ends with punctuation.

number
smart_endpointing
required

Model-based end-of-turn detection.

string
Allowed values: off livekit
wait_seconds
required

Silence after the caller stops before the assistant answers.

number
stop_speaking_plan
required
object
backoff_seconds
required

Pause before the assistant speaks again after an interruption.

number
interruption_confirm_ms
required

With num_words: 0: how long to wait for a real word before resuming.

integer
>= -9007199254740991 <= 9007199254740991
num_words
required

Words the caller must say to interrupt the assistant (0: voice alone).

integer
>= -9007199254740991 <= 9007199254740991
voice_seconds
required

Seconds of caller voice that count as an interruption.

number
answering_machine_detection
required

Answering-machine detection on outbound calls.

object
max_decision_ms
required

The longest the verdict may take after answer; unsure counts as a person.

integer
>= -9007199254740991 <= 9007199254740991
message
required

The message left with leave_message.

string
mode
required

On outbound calls: off, hang_up on a machine, or leave_message after the beep.

string
Allowed values: off hang_up leave_message
artifacts
required

What is kept after a call.

object
logging
required

Keep the call’s event log.

boolean
recording
required

Record the call.

boolean
summary
required

Write an AI summary (intent, outcome, action items) when the call ends.

boolean
transcript
required

Keep the transcript.

boolean
created
required

An ISO-8601 timestamp in UTC.

string format: date-time
end_call_message
required

Said before the assistant ends the call.

string
end_call_phrases
required

Phrases that end the call when the assistant says them.

Array<string>
first_message
required

What the assistant says first.

string
first_message_mode
required

Whether the assistant speaks first (first_message), waits for the caller, or generates its opening.

string
Allowed values: assistant_speaks_first assistant_waits_for_user assistant_generates_first_message
flow_id
required
Any of:

The voice flow that drives the call, or null (the system prompt does).

string
/^flow_[0-9A-Za-z]+$/
id
required

The assistant’s ID.

string
/^asst_[0-9A-Za-z]+$/
language
required

The call language (BCP-47, e.g. he, en).

string
livemode
required

true in live mode, false in test mode.

boolean
llm
required

The language model behind the assistant.

object
max_output_tokens
required

The longest reply, in tokens.

integer
>= -9007199254740991 <= 9007199254740991
model
required

The model, e.g. gpt-4.1.

string
provider
required

The language-model provider.

string
Allowed values: openai
temperature
required

Sampling temperature, 0–2.

number
max_duration_seconds
required

Calls end after this long.

number
metadata
required

Up to 50 key/value pairs (keys up to 40 characters, values up to 500) you attach to an object. Returned as sent.

object
<= 50 properties
key
additional properties
string
<= 500 characters
name
required

The assistant’s name (yours; callers never hear it).

string
object
required
string
Allowed value: assistant
public
required

Publishable keys (the browser widget) may start web calls to this assistant.

boolean
system_prompt
required

The instructions the model follows.

string
tools
required

The tools the assistant can use.

object
add_participant
required
Any of:
object
allow
required

Who may be added: any number, Israeli mobiles only, or the numbers list.

string
Allowed values: any il_mobile list
numbers
required

The numbers allowed with allow: list.

Array<string>
custom
required

Your own tools (webhooks).

Array<object>

A tool the assistant can call during a call.

object
contract
required

The request/response contract: legacy ({tool, arguments, call:{id}}) or v1 (rich call context and say / end_call / transfer responses).

string
Allowed values: legacy v1
description
required

What the tool does and when to call it, for the model.

string
enabled
required

Disabled tools are kept but not offered to the model.

boolean
header_names
required

Names of the extra request headers stored for this tool. Header values are write-only and never returned.

Array<string>
mock_response
required

The answer of a mock tool; {{argument}} placeholders are filled in.

string
name
required

The function name the model calls (letters, digits, _ and -).

string
parameters
required

JSON Schema of the arguments the model passes.

object
key
additional properties
request_start_message
required

Spoken while the tool runs (empty: nothing).

string
timeout_seconds
required

How long to wait for the webhook to answer.

number
type
required

webhook: a signed request is POSTed to url. mock: answers mock_response without any request (for testing prompts).

string
Allowed values: webhook mock
url
required

The webhook URL (webhook tools).

string | null
end_call
required

The assistant may end the call (end_call).

boolean
get_current_time
required

The assistant may look up the current date and time.

boolean
transfer_call
required
Any of:
object
destination
required

queue:<queue id or name>, a phone number, or a sip: URI.

string
web_search
required

The assistant may search the web.

boolean
transcriber
required

How the assistant hears.

object
context
required

Free text that helps recognition (the business, the topic).

string
language_hints
required

Languages to expect (ISO 639-1).

Array<string>
model
required

The STT model.

string
provider
required

The speech-to-text provider.

string
Allowed values: soniox
strict_language_hints
required

Only transcribe the hinted languages.

boolean
terms
required

Words and names to recognise better (products, people, places).

Array<string>
updated
required

An ISO-8601 timestamp in UTC.

string format: date-time
voice
required

How the assistant sounds.

object
expressions
required

Let the model add vocal events (breaths, laughs, pauses).

boolean
model
required

The TTS model.

string
provider
required

The text-to-speech provider.

string
Allowed values: gemini
style
required

Delivery direction, e.g. warm, friendly and natural. With style_mode: dynamic it is the fallback.

string
style_mode
required

dynamic: the model adapts the delivery to the caller per reply. fixed: style is always used.

string
Allowed values: dynamic fixed
tier
required

TTS tier: auto (the plan’s default), premium or lite.

string
Allowed values: auto premium lite
voice_id
required

A voice from GET /v1/voices (its voice_id).

string
Example
{
"advanced": {
"expression_tags": [
"breath",
"laugh"
],
"idle": {
"max_messages": 3,
"messages": [
"את/ה עדיין איתי?"
],
"timeout_seconds": 7.5
},
"intelligent_turn_taking": false,
"latency": {
"acknowledgement_after_ms": 700,
"acknowledgement_phrases": [
"אממ…"
],
"acknowledgements": true,
"early_start": true,
"early_start_ms": 300,
"first_chunk_max_words": 25
},
"llm_routing": {
"complex_model": null,
"mode": "off",
"simple_model": "gpt-4.1-mini",
"sticky_turns": 3
},
"max_endpoint_delay_ms": 1000,
"silence_timeout_seconds": 30,
"start_speaking_plan": {
"on_no_punctuation_seconds": 1.5,
"on_number_seconds": 0.5,
"on_punctuation_seconds": 0.1,
"smart_endpointing": "off",
"wait_seconds": 0.4
},
"stop_speaking_plan": {
"backoff_seconds": 1,
"interruption_confirm_ms": 900,
"num_words": 0,
"voice_seconds": 0.2
}
},
"answering_machine_detection": {
"max_decision_ms": 3500,
"message": "",
"mode": "off"
},
"artifacts": {
"logging": true,
"recording": true,
"summary": true,
"transcript": true
},
"created": "2026-11-03T09:14:22.000Z",
"end_call_message": "תודה ששוחחת איתי, יום נעים!",
"end_call_phrases": [
"להתראות"
],
"first_message": "שלום, הגעתם למרפאת השרון. איך אפשר לעזור?",
"first_message_mode": "assistant_speaks_first",
"flow_id": null,
"id": "asst_3cYbE6uYvGkH8w4ZK1rTqd",
"language": "he",
"livemode": true,
"llm": {
"max_output_tokens": 400,
"model": "gpt-4.1",
"provider": "openai",
"temperature": 1
},
"max_duration_seconds": 600,
"metadata": {
"crm_id": "0031x00000AbCdE"
},
"name": "Clinic receptionist",
"object": "assistant",
"public": false,
"system_prompt": "You book, move and cancel appointments. Keep answers short.",
"tools": {
"add_participant": null,
"custom": [
{
"contract": "legacy",
"description": "Find free appointment slots for a doctor and date",
"enabled": true,
"header_names": [
"Authorization"
],
"mock_response": "{\"ok\": true}",
"name": "find_slots",
"parameters": {
"properties": {
"date": {
"type": "string"
},
"doctor": {
"type": "string"
}
},
"required": [
"date"
],
"type": "object"
},
"request_start_message": "רגע, אני בודקת",
"timeout_seconds": 15,
"type": "webhook",
"url": "https://crm.example.com/voice/tools"
}
],
"end_call": true,
"get_current_time": false,
"transfer_call": {
"destination": "queue:reception"
},
"web_search": false
},
"transcriber": {
"context": "",
"language_hints": [
"he",
"en"
],
"model": "stt-rt-v5",
"provider": "soniox",
"strict_language_hints": false,
"terms": [
"השרון"
]
},
"updated": "2026-11-03T09:14:22.000Z",
"voice": {
"expressions": true,
"model": "gemini-3.8-flash-tts",
"provider": "gemini",
"style": "warm",
"style_mode": "dynamic",
"tier": "auto",
"voice_id": "Kore"
}
}

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.

No object with this ID exists in this organisation and mode.

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": "resource_missing",
"doc_url": "https://docs.morevoice.ai/api/errors#resource-missing",
"message": "No such object: 'call_4Gk2'.",
"param": "id",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "not_found"
}
}
X-Request-Id
string

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

The request conflicts with the object’s state, or the Idempotency-Key was reused with other parameters.

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": "idempotency_mismatch",
"doc_url": "https://docs.morevoice.ai/api/errors#idempotency-mismatch",
"message": "This Idempotency-Key was already used with different parameters.",
"request_id": "req_7Hk2LmN9pQ4rS6tV8wX0yZ",
"type": "idempotency_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.