Create an assistant
/assistantsCreate a voice agent: the prompt the LLM follows, how it opens the call, its voice (Cartesia, ElevenLabs and Gradium), the data to extract after each call and where to post the result. Once created, pass its ID as assistant_id to place calls or to create a campaign.
Request body
application/jsonpromptstringrequiredSystem prompt given to the LLM for the whole call: who the agent is, its goal and how to run the conversation. May contain {{variable}} placeholders, filled from the call's prompt_variables.
namestringrequiredDisplay name of the assistant, shown in the dashboard and in call lists.
post_call_promptstringnullableInstructions the agent follows once the call has ended: who to email, when to text, what to post on Slack or Teams. Plain language, no template syntax. Empty or null means no post-call agent runs.
first_sentencestringThe agent's opening line, spoken word for word. Only used, and only kept, with first_sentence_mode 'static': with 'generated' or 'none' it is dropped and reads back empty. May contain {{variable}} placeholders; one without a value is left out.
first_sentence_mode"generated" | "static" | "none"How the agent opens the call. Default at creation: 'generated'.
"generated"The agent opens with a greeting it writes from the prompt. first_sentence is not used, and not kept.
"static"The agent opens with first_sentence, word for word.
"none"The agent says nothing first and waits for the other person to speak.
end_of_call_sentencestringSentence the agent says, without being interruptible, when it decides to end the call. Null or empty: the agent says a short default goodbye, only if it has not said goodbye already.
voiceobjectThe voice the agent speaks with (
GET /voiceslists them). Its language (seeGET /voices) is the language of the calls, unless voice_languages picks another one for a call. Omitted at creation: Revox's default voice, Jacqueline from Cartesia (id 9626c31c-bec5-4cca-baa8-f8ba9e84c8bc), which speaks English.voice_languagesarray of objectnullableExtra languages for a multilingual assistant, each with its own voice (any provider). A call picks one with a
languageentry in its prompt_variables (a language code such as "es", or a name such as "Spanish"); otherwise the phone number's country picks one, and failing that the call runs in the language ofvoice, which cannot be listed here. A changed voice is applied to the calls in that language that have not completed yet; a language still used by such a call cannot be removed.cartesia_dictionary_pronunciation_idstringnullableOptional Cartesia pronunciation dictionary ID to use for this assistant's calls. Set null to unlink it.
at least 1 character
llm_modelobjectThe LLM that drives the conversation. Defaults to
recommended(the model Revox currently recommends for voice agents) when omitted at creation.webhook_urlstringURL that receives a POST with the call and this assistant once the call is over, when it reaches completed or errored (not when it is cancelled). See Webhooks for the payload.
max_call_duration_secsnumberLongest a call may last, in seconds: the agent then says max_duration_end_message, if set, and hangs up. Default at creation: 300. Outbound calls are capped at 600.
max_duration_end_messagestringnullableOptional message the agent will say, without being interruptible, when the call reaches its max duration. Kept short so it fits inside the farewell buffer. If not set, the call ends silently.
at most 150 characters
structured_output_configarray of objectThe values to extract from each call (e.g. an email, a budget, a date). They land in structured_output of each call attempt, keyed by name.
structured_output_promptstringnullableCustom prompt for structured data extraction. If not provided, a default prompt is used. Available variables: {{transcript}}, {{call_direction}}, {{user_phone_number}}, {{agent_phone_number}}.
call_retry_configobjecttimezonestringIANA timezone of this assistant's calls, e.g. 'Europe/Paris' or 'America/Phoenix'. Every call runs in exactly one timezone: its calling windows and allowed days are read in it, the agent tells the date and offers calendar slots in it, and callbacks and extracted datetimes are interpreted in it. A campaign's
timezone, thenPOST /calltimezone, override it for their calls. Default when creating: 'Europe/Paris'. Replaces the deprecatedcall_retry_config.timezone.background_sound"audio/office.ogg" | "audio/waves.m4a"nullableAmbient background sound to play during the call. null/omitted disables it.
background_sound_volumenumberVolume of the ambient background sound (0 = silent, 1 = max).
0 to 1
thinking_soundenum (7 values)nullableAudio clip played while the agent prepares an answer. Null or omitted: none.
Possible values
"city-ambience.ogg""forest-ambience.ogg""office-ambience.ogg""crowded-room.ogg""keyboard-typing.ogg""keyboard-typing2.ogg""hold_music.ogg"thinking_sound_volumenumberVolume of the thinking sound (0 = silent, 1 = max).
0 to 1
thinking_sound_probabilitynumberProbability [0..1] that the thinking sound plays on any given turn; otherwise the agent is silent while thinking.
0 to 1
transfer_destinationsarray of objectnullableWhere calls can be transferred to when users ask to speak to a human. With a single entry the assistant always transfers there; with several, it picks one at transfer time by applying the routing rules written in the assistant's own prompt (which refer to the destination labels). Empty or null disables transfer.
at most 10 items
human_transfer_mode"warm" | "cold"nullableHow calls are transferred to transfer_destinations. Default: 'warm'. Ignored without transfer destinations.
"warm"The agent calls the destination first, briefs the person who answers on the call so far (see warm_transfer_summary_instructions), then puts the caller through.
"cold"The call is passed on at once, without a briefing (a SIP REFER: the phone carrier must allow it).
warm_transfer_summary_instructionsstringnullableWhen using warm transfer: extra instructions for the supervisor handoff summary. If null or empty, the API uses the product default briefing when the call is loaded for the agent.
warm_transfer_voice_speednumbernullableWhen using warm transfer: voice speed used only while the AI briefs the human colleague. Same range as voice.speed. Omit or null to brief at the assistant's voice speed.
0.6 to 1.5
voicemail_messagestringnullableIf set, when voicemail is detected the agent will speak this message then hang up; if null, hang up immediately. Left on the first attempt only (second dial of a double call). Takes the same {{variables}} as the prompt (e.g. "Hi {{first_name}}, this is Julie from Acme, please call us back.").
stt_contextobjectnullableAssistant-level speech-to-text context: structured
generalkey/value pairs plus a list of domainterms. Prompt-derived context is merged in without replacing existing entries.first_sentence_delay_msintegerDelay in milliseconds before speaking the first sentence. Default: 400.
≥ 0
hubspotobjectnullableHubSpot Meetings config. When set with at least one meeting link, the agent can read a rep's real availability and book the meeting natively in HubSpot during the call. Null when HubSpot is not connected.
slackobjectnullableSlack config. When set, the post-call agent can post to the listed channels after a call; whether it posts, and what it says, is decided by
post_call_prompt. Null when Slack is not connected.teamsobjectnullableMicrosoft Teams config. When set with at least one channel, the post-call agent can post to those channels when the post-call instructions ask for it. Null when Teams is not connected.
zohoobjectnullableZoho CRM config. When set, the post-call agent can upsert the prospect (keyed on phone) into the chosen module and attach a Note with the call summary. Null when Zoho is not connected.
custom_toolsarray of objectnullableCustom API tools the assistant can call during conversations. Each tool defines an HTTP endpoint with variable substitution. Null or empty when the assistant has none.
from_phone_numberstringnullableCaller ID of the calls placed with this assistant: a number of your organization (
GET /phone-numbers), in E.164 format. A French mobile number (06, 07) cannot be the caller ID of an automated call. Null: a Revox number chosen for each destination.precall_lookup_urlstringnullableInbound calls only. URL fetched over HTTP GET right before the call is answered, with
{{phone}}replaced by the caller's number in E.164 format (URL-encoded), to fill the{{variable}}placeholders the assistant declares. It answers either{"prompt_variables": {...}}or a flat JSON object whose top-level fields are the variables. The call is always answered: if the endpoint fails, takes more than 3 seconds, answers 404 or leaves a variable out, the missing variables are marked as not provided. Must be an http(s) URL containing{{phone}}. When null, no lookup is performed.at most 2000 characters
precall_lookup_headersarray of objectnullableHTTP headers sent with the pre-call lookup request, e.g. an API key. Null or empty when the endpoint needs none.
at most 10 items
Response
200assistantAssistantidstringUnique ID of the assistant (UUID). Pass it as assistant_id to place a call or create a campaign with this assistant.
Example
"3f6c2a1e-8b4d-4c7a-9e2f-5d1b7a9c0e34"promptstringSystem prompt given to the LLM for the whole call: who the agent is, its goal and how to run the conversation. May contain {{variable}} placeholders, filled from the call's prompt_variables.
post_call_promptstringnullableInstructions the agent follows once the call has ended: who to email, when to text, what to post on Slack or Teams. Plain language, no template syntax. Empty or null means no post-call agent runs.
first_sentencestringnullableThe agent's opening line, spoken word for word. Only used, and only kept, with first_sentence_mode 'static': with 'generated' or 'none' it is dropped and reads back empty. May contain {{variable}} placeholders; one without a value is left out.
first_sentence_mode"generated" | "static" | "none"How the agent opens the call. Default at creation: 'generated'.
"generated"The agent opens with a greeting it writes from the prompt. first_sentence is not used, and not kept.
"static"The agent opens with first_sentence, word for word.
"none"The agent says nothing first and waits for the other person to speak.
end_of_call_sentencestringnullableSentence the agent says, without being interruptible, when it decides to end the call. Null or empty: the agent says a short default goodbye, only if it has not said goodbye already.
voiceobjectnullableThe voice the agent speaks with: provider, voice ID and speed. Its language (see
GET /voices) is the language of the calls, unless voice_languages picks another one for a call. Always set on a saved assistant.voice_languagesarray of objectnullableExtra languages for a multilingual assistant, each with its own voice. Null for a single-language assistant.
cartesia_dictionary_pronunciation_idstringnullableOptional Cartesia pronunciation dictionary ID linked to this assistant.
llm_modelobjectThe LLM that drives the conversation. Defaults to
recommended(the model Revox currently recommends for voice agents) when omitted at creation.webhook_urlstringnullableURL that receives a POST with the call and this assistant once the call is over, when it reaches completed or errored (not when it is cancelled). See Webhooks for the payload.
max_call_duration_secsnumberLongest a call may last, in seconds: the agent then says max_duration_end_message, if set, and hangs up. Default at creation: 300. Outbound calls are capped at 600.
max_duration_end_messagestringnullableOptional message the agent will say, without being interruptible, when the call reaches its max duration. Kept short so it fits inside the farewell buffer. If null, the call ends silently.
at most 150 characters
The values to extract from each call (e.g. an email, a budget, a date). They land in structured_output of each call attempt, keyed by name.
structured_output_promptstringnullableCustom prompt for structured data extraction. If not provided, a default prompt is used. Available variables: {{transcript}}, {{call_direction}}, {{user_phone_number}}, {{agent_phone_number}}.
When and how often the assistant's calls are dialed. Null: the defaults.
timezonestringIANA timezone of this assistant's calls, e.g. 'Europe/Paris' or 'America/Phoenix'. Every call runs in exactly one timezone: its calling windows and allowed days are read in it, the agent tells the date and offers calendar slots in it, and callbacks and extracted datetimes are interpreted in it. A campaign's
timezone, thenPOST /calltimezone, override it for their calls. Default when creating: 'Europe/Paris'. Replaces the deprecatedcall_retry_config.timezone.background_sound"audio/office.ogg" | "audio/waves.m4a"nullableAmbient background sound to play during the call. null disables it.
background_sound_volumenumberVolume of the ambient background sound (0 = silent, 1 = max).
0 to 1
thinking_soundenum (7 values)nullableAudio clip played while the agent prepares an answer. Null or omitted: none.
Possible values
"city-ambience.ogg""forest-ambience.ogg""office-ambience.ogg""crowded-room.ogg""keyboard-typing.ogg""keyboard-typing2.ogg""hold_music.ogg"thinking_sound_volumenumberVolume of the thinking sound (0 = silent, 1 = max).
0 to 1
thinking_sound_probabilitynumberProbability [0..1] that the thinking sound plays on any given turn; otherwise the agent is silent while thinking.
0 to 1
transfer_destinationsarray of objectnullableWhere calls can be transferred to when users ask to speak to a human. Null or empty when transfer is not configured.
human_transfer_mode"warm" | "cold"nullableWarm or cold transfer when transfer_destinations is non-empty; null when transfer is not configured.
"warm"The agent calls the destination first, briefs the person who answers on the call so far (see warm_transfer_summary_instructions), then puts the caller through.
"cold"The call is passed on at once, without a briefing (a SIP REFER: the phone carrier must allow it).
warm_transfer_summary_instructionsstringnullableWarm transfer only: instructions for the supervisor handoff summary; null when not configured or cold transfer.
warm_transfer_voice_speednumbernullableWarm transfer only: voice speed of the briefing to the human colleague; null when it follows voice.speed, not configured, or cold transfer.
0.6 to 1.5
voicemail_messagestringnullableIf set, when voicemail is detected the agent will speak this message then hang up; if null, hang up immediately.
stt_contextobjectnullableAssistant-level speech-to-text context: structured
generalkey/value pairs plus a list of domainterms. Prompt-derived context is merged in without replacing existing entries.first_sentence_delay_msintegerDelay in milliseconds before speaking the first sentence. Default: 400.
calendarsarray of AssistantCalendarThe calendars the agent books meetings on during a call, each named by the handle the prompt mentions. Only the
readyones are offered to the agent.hubspotobjectnullableHubSpot Meetings config. When set with at least one meeting link, the agent can read a rep's real availability and book the meeting natively in HubSpot during the call. Null when HubSpot is not connected.
slackobjectnullableSlack config. When set, the post-call agent can post to the listed channels after a call; whether it posts, and what it says, is decided by
post_call_prompt. Null when Slack is not connected.teamsobjectnullableMicrosoft Teams config. When set with at least one channel, the post-call agent can post to those channels when the post-call instructions ask for it. Null when Teams is not connected.
zohoobjectnullableZoho CRM config. When set, the post-call agent can upsert the prospect (keyed on phone) into the chosen module and attach a Note with the call summary. Null when Zoho is not connected.
custom_toolsarray of objectnullableCustom API tools the assistant can call during conversations. Each tool defines an HTTP endpoint with variable substitution. Null or empty when the assistant has none.
from_phone_numberstringnullableCaller ID of the calls placed with this assistant: a number of your organization (
GET /phone-numbers), in E.164 format. A French mobile number (06, 07) cannot be the caller ID of an automated call. Null: a Revox number chosen for each destination.demo_page_urlstringnullablePublic demo page of the assistant: anyone with this link can call the assistant and see the calls it placed, their transcripts and recordings. Null when the page is off. Turn it on, regenerate it or turn it off with
POST /.assistants/ {id}/ demo-page precall_lookup_urlstringnullableURL fetched before an inbound call is answered to resolve the assistant's prompt variables. Null when no lookup is configured.
precall_lookup_headersarray of objectnullableHTTP headers sent with the pre-call lookup request. Null when none are configured.
organization_idstringID of the organization that owns the assistant.
namestringDisplay name of the assistant, shown in the dashboard and in call lists.
Example
"Appointment reminders"is_inbound_receptionistbooleanoptionalTrue when at least one of the organization's phone numbers sends its inbound calls to this assistant (see
PATCH /, inbound_assistant_id). Not computed by every endpoint: absent or false does not prove that no number routes to it.phone-numbers/ {id} created_byobjectoptionalnullableThe user who created the assistant. Null for assistants created by Revox itself, for assistants created before this was tracked, and when that user was deleted.
created_atstring (date-time)When the assistant was created (ISO 8601).
updated_atstring (date-time)When the assistant was last modified (ISO 8601).
Errors
- 400Invalid request: a field or parameter failed validation
{ "message"?: string, "error"?: string, "bodyErrors"?: {…} }
Error bodies carry an error (or message) string; a 400 adds bodyErrors.issues. See Errors.