Skip to content
Assistants

Create an assistant

POST/assistants

Create 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

  • promptstringrequired

    System 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.

  • namestringrequired

    Display name of the assistant, shown in the dashboard and in call lists.

  • post_call_promptstringnullable

    Instructions 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_sentencestring

    The 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_sentencestring

    Sentence 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.

  • voiceobject

    The voice the agent speaks with (GET /voices lists them). Its language (see GET /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 objectnullable

    Extra languages for a multilingual assistant, each with its own voice (any provider). A call picks one with a language entry 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 of voice, 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_idstringnullable

    Optional Cartesia pronunciation dictionary ID to use for this assistant's calls. Set null to unlink it.

    at least 1 character

  • llm_modelobject

    The LLM that drives the conversation. Defaults to recommended (the model Revox currently recommends for voice agents) when omitted at creation.

  • webhook_urlstring

    URL 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_secsnumber

    Longest 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_messagestringnullable

    Optional 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 object

    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_promptstringnullable

    Custom 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_configobject
  • timezonestring

    IANA 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, then POST /call timezone, override it for their calls. Default when creating: 'Europe/Paris'. Replaces the deprecated call_retry_config.timezone.

  • background_sound"audio/office.ogg" | "audio/waves.m4a"nullable

    Ambient background sound to play during the call. null/omitted disables it.

  • background_sound_volumenumber

    Volume of the ambient background sound (0 = silent, 1 = max).

    0 to 1

  • thinking_soundenum (7 values)nullable

    Audio 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_volumenumber

    Volume of the thinking sound (0 = silent, 1 = max).

    0 to 1

  • thinking_sound_probabilitynumber

    Probability [0..1] that the thinking sound plays on any given turn; otherwise the agent is silent while thinking.

    0 to 1

  • transfer_destinationsarray of objectnullable

    Where 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"nullable

    How 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_instructionsstringnullable

    When 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_speednumbernullable

    When 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

  • ivr_navigation_enabledboolean

    Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and skip turns to navigate phone menus.

  • voicemail_messagestringnullable

    If 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_contextobjectnullable

    Assistant-level speech-to-text context: structured general key/value pairs plus a list of domain terms. Prompt-derived context is merged in without replacing existing entries.

  • first_sentence_delay_msinteger

    Delay in milliseconds before speaking the first sentence. Default: 400.

    ≥ 0

  • hubspotobjectnullable

    HubSpot 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.

  • slackobjectnullable

    Slack 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.

  • teamsobjectnullable

    Microsoft 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.

  • zohoobjectnullable

    Zoho 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 objectnullable

    Custom 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_numberstringnullable

    Caller 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_urlstringnullable

    Inbound 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 objectnullable

    HTTP 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

200
  • assistantAssistant
    • idstring

      Unique 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"

    • promptstring

      System 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_promptstringnullable

      Instructions 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_sentencestringnullable

      The 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_sentencestringnullable

      Sentence 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.

    • voiceobjectnullable

      The 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 objectnullable

      Extra languages for a multilingual assistant, each with its own voice. Null for a single-language assistant.

    • cartesia_dictionary_pronunciation_idstringnullable

      Optional Cartesia pronunciation dictionary ID linked to this assistant.

    • llm_modelobject

      The LLM that drives the conversation. Defaults to recommended (the model Revox currently recommends for voice agents) when omitted at creation.

    • webhook_urlstringnullable

      URL 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_secsnumber

      Longest 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_messagestringnullable

      Optional 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

    • structured_output_configarray of StructuredOutputFieldnullable

      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_promptstringnullable

      Custom 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_configCallRetryConfignullable

      When and how often the assistant's calls are dialed. Null: the defaults.

    • timezonestring

      IANA 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, then POST /call timezone, override it for their calls. Default when creating: 'Europe/Paris'. Replaces the deprecated call_retry_config.timezone.

    • background_sound"audio/office.ogg" | "audio/waves.m4a"nullable

      Ambient background sound to play during the call. null disables it.

    • background_sound_volumenumber

      Volume of the ambient background sound (0 = silent, 1 = max).

      0 to 1

    • thinking_soundenum (7 values)nullable

      Audio 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_volumenumber

      Volume of the thinking sound (0 = silent, 1 = max).

      0 to 1

    • thinking_sound_probabilitynumber

      Probability [0..1] that the thinking sound plays on any given turn; otherwise the agent is silent while thinking.

      0 to 1

    • transfer_destinationsarray of objectnullable

      Where 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"nullable

      Warm 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_instructionsstringnullable

      Warm transfer only: instructions for the supervisor handoff summary; null when not configured or cold transfer.

    • warm_transfer_voice_speednumbernullable

      Warm 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

    • ivr_navigation_enabledboolean

      Enable IVR navigation tools. When enabled, the assistant can send DTMF tones and skip turns to navigate phone menus.

    • voicemail_messagestringnullable

      If set, when voicemail is detected the agent will speak this message then hang up; if null, hang up immediately.

    • stt_contextobjectnullable

      Assistant-level speech-to-text context: structured general key/value pairs plus a list of domain terms. Prompt-derived context is merged in without replacing existing entries.

    • first_sentence_delay_msinteger

      Delay in milliseconds before speaking the first sentence. Default: 400.

    • calendarsarray of AssistantCalendar

      The calendars the agent books meetings on during a call, each named by the handle the prompt mentions. Only the ready ones are offered to the agent.

    • hubspotobjectnullable

      HubSpot 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.

    • slackobjectnullable

      Slack 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.

    • teamsobjectnullable

      Microsoft 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.

    • zohoobjectnullable

      Zoho 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 objectnullable

      Custom 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_numberstringnullable

      Caller 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_urlstringnullable

      Public 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_urlstringnullable

      URL fetched before an inbound call is answered to resolve the assistant's prompt variables. Null when no lookup is configured.

    • precall_lookup_headersarray of objectnullable

      HTTP headers sent with the pre-call lookup request. Null when none are configured.

    • organization_idstring

      ID of the organization that owns the assistant.

    • namestring

      Display name of the assistant, shown in the dashboard and in call lists.

      Example "Appointment reminders"

    • is_inbound_receptionistbooleanoptional

      True when at least one of the organization's phone numbers sends its inbound calls to this assistant (see PATCH /phone-numbers/{id}, inbound_assistant_id). Not computed by every endpoint: absent or false does not prove that no number routes to it.

    • created_byobjectoptionalnullable

      The 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.