> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revring.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Duplicate Agent

> Create a copy of an existing agent. Copies all configuration, custom tools, and knowledge base assignments. Phone numbers are not copied and must be assigned to the new agent separately. The new agent's name is the original name with ` (Copy)` appended.



## OpenAPI

````yaml POST /agents/{id}/duplicate
openapi: 3.1.0
info:
  title: RevRing Voice AI API
  description: >-
    RevRing Voice AI platform API for managing AI voice agents, phone calls, SIP
    trunks, and analytics. Build intelligent voice applications that can handle
    inbound and outbound phone calls with AI-powered conversational agents.
  version: 1.0.0
  contact:
    name: RevRing Support
    url: https://revring.ai
servers:
  - url: https://api.revring.ai/v1
    description: Production API
security:
  - apiKeyAuth: []
tags:
  - name: Messaging Connections
    description: Connect messaging providers so agents can send text messages
  - name: Messages
    description: Send text messages and read your message log
  - name: Conversations
    description: List and clear managed conversation threads
  - name: SIP Trunks
    description: Manage SIP trunks for connecting agents to the phone network
  - name: Agents
    description: Manage AI voice agents and their configuration
  - name: Agent Folders
    description: Organize agents into folders for dashboard navigation
  - name: Calls
    description: Manage and query phone calls
  - name: Analytics
    description: Get analytics and metrics about your calls
  - name: Knowledge Bases
    description: >-
      Manage knowledge bases and sources for agent retrieval-augmented
      generation
  - name: Test Suites
    description: Manage test suites, test cases, and test runs for agent evaluation
  - name: Voices
    description: Browse the voices available to your organization for agent speech
paths:
  /agents/{id}/duplicate:
    parameters:
      - name: id
        in: path
        required: true
        description: Agent ID
        schema:
          type: string
          format: uuid
    post:
      tags:
        - Agents
      summary: Duplicate Agent
      description: >-
        Create a copy of an existing agent. Copies all configuration, custom
        tools, and knowledge base assignments. Phone numbers are not copied and
        must be assigned to the new agent separately. The new agent's name is
        the original name with ` (Copy)` appended.
      operationId: duplicateAgent
      responses:
        '201':
          description: Duplicated agent
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Agent'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '402':
          $ref: '#/components/responses/BillingInactiveError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '409':
          description: >-
            Conflict — a uniqueness constraint was violated while creating the
            copy
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    enum:
                      - conflict
components:
  schemas:
    Agent:
      type: object
      description: AI Voice Agent configuration
      properties:
        messagingConnectionId:
          type: string
          nullable: true
          description: >-
            ID of the messaging connection this agent sends and receives texts
            through (see Messaging Connections).
        messagingConfig:
          $ref: '#/components/schemas/MessagingConfig'
        widgetKey:
          type: string
          nullable: true
          readOnly: true
          description: >-
            Public embed key for the website chat widget (starts with 'rrwk_').
            Minted automatically the first time the widget is enabled.
            Read-only; it appears in the embed snippet you paste on your site.
        widgetConfig:
          $ref: '#/components/schemas/WidgetConfig'
        id:
          type: string
          format: uuid
        sipTrunkId:
          type:
            - string
            - 'null'
          format: uuid
        sipTrunk:
          type: object
          properties:
            friendlyName:
              type: string
              nullable: true
        folderId:
          type: string
          format: uuid
          nullable: true
          description: ID of the folder this agent belongs to, or null for uncategorized
        folder:
          type: object
          nullable: true
          description: Summary of the folder this agent belongs to
          properties:
            id:
              type: string
              format: uuid
            name:
              type: string
            color:
              type: string
              nullable: true
        name:
          type: string
          description: Agent name
        status:
          type: string
          enum:
            - active
            - disabled
        promptTemplate:
          type: string
          description: System prompt template with {{variable}} placeholders
        defaultVariables:
          type: object
          nullable: true
          description: Default template variables
        firstMessage:
          type: string
          nullable: true
          description: Agent's opening message
        firstMessageMode:
          type: string
          enum:
            - static
            - dynamic
          nullable: true
          description: >-
            How the agent opens the call. "static" speaks the first message
            text. "dynamic" generates the opening line from the agent's prompt.
            null uses the default behavior: speak the first message if set,
            otherwise wait for the caller.
        turnTimeoutSeconds:
          type: integer
          description: Seconds to wait for user response
        silenceEndCallTimeoutSeconds:
          type: integer
          description: Silence duration before ending call
        maxConversationDurationSeconds:
          type: integer
          description: Maximum call duration
        llmTemperature:
          type: number
          minimum: 0
          maximum: 2
          description: >-
            LLM temperature for response randomness (0 = deterministic, 2 = very
            creative)
        llmModel:
          type: string
          enum:
            - revring-standard
            - revring-max
            - revring-ultra
          description: >-
            Language model tier powering the agent. Usage is billed per minute
            at the tier's rate: revring-standard $0.03/min, revring-max
            $0.05/min, revring-ultra $0.065/min. Defaults to revring-standard.
        timezone:
          type: string
          description: IANA timezone identifier (e.g., America/New_York, Europe/London)
        language:
          type: string
          description: Language code (e.g., en, es, fr, de)
        preCallWebhookUrl:
          type: string
          format: uri
          nullable: true
          description: Webhook URL called before answering inbound calls
        postCallWebhookUrl:
          type: string
          format: uri
          nullable: true
          description: Webhook URL called after call ends with transcript and recording
        endCallEnabled:
          type: boolean
          description: Allow agent to end the call
        endCallRulesOverride:
          type: string
          nullable: true
          description: Custom instructions for when agent should end call
        transferEnabled:
          type: boolean
          description: Allow agent to transfer calls
        transferRoutes:
          type: array
          nullable: true
          description: Available transfer destinations with conditions
          items:
            type: object
            properties:
              to_number:
                type: string
                pattern: ^\+[1-9]\d{1,14}$
                description: Transfer destination number (E.164)
              condition:
                type: string
                description: When to offer this transfer option
              extension:
                type: string
                pattern: ^[0-9*#w]+$
                description: >-
                  Optional touch-tone digits dialed after the call connects, to
                  reach an extension behind a phone menu (e.g. "123#"). Allowed:
                  0-9, *, #, and w for a 0.5s pause. Warm transfers only.
        transferDescriptionOverride:
          type: string
          nullable: true
          description: Custom instructions for transfer feature
        voicemailEnabled:
          type: boolean
          description: Enable voicemail detection
        voicemailAction:
          type: string
          enum:
            - hangup
            - leave_message
          description: What to do when voicemail is detected
        voicemailMessage:
          type: string
          nullable: true
          description: >-
            Message to leave on voicemail (if action is leave_message). Supports
            {{variables}} like the prompt and first message.
        voiceId:
          type: string
          description: Voice ID (copy from dashboard Voice Library)
        voiceTemperature:
          type: number
          minimum: 0
          maximum: 1
          description: Voice expressiveness (0 = consistent, 1 = more varied). Default 0.7.
        voiceSpeed:
          type: number
          minimum: 0.5
          maximum: 2
          description: >-
            Speaking rate multiplier (0.5 = half speed, 2.0 = double speed).
            Default 1.0.
        voiceVolume:
          type: number
          minimum: -20
          maximum: 20
          description: Output level in decibels (-20 to 20; 0 = standard). Default 0.
        voiceTopP:
          type: number
          minimum: 0
          maximum: 1
          description: Advanced sampling range (0 to 1). Default 0.7.
        runtimeConfig:
          type: object
          nullable: true
          description: Advanced runtime configuration
        phoneNumbers:
          type: array
          description: Phone numbers assigned to this agent for inbound calls
          items:
            $ref: '#/components/schemas/AgentPhoneNumber'
        customTools:
          type: array
          description: Custom function calling tools available to this agent
          items:
            $ref: '#/components/schemas/AgentCustomTool'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        mode:
          type: string
          enum:
            - single_prompt
            - conversation_flow
          description: >-
            Agent mode. Set at creation time and cannot be changed.
            `single_prompt` uses a single system prompt; `conversation_flow`
            uses a multi-step flow definition.
        flowDefinition:
          type: object
          nullable: true
          description: >-
            Conversation flow definition (only used when mode is
            `conversation_flow`)
        testVariables:
          type: object
          nullable: true
          description: Variables used for test calls initiated from the dashboard
        llmReasoningEffort:
          type: string
          enum:
            - low
            - medium
            - high
          description: >-
            Controls the reasoning effort of the language model. Higher values
            produce more thorough but slower responses.
        disableInterruptions:
          type: boolean
          description: >-
            When enabled, the agent will not be interrupted by the caller while
            speaking
        interruptionThresholdMs:
          type: integer
          minimum: 100
          maximum: 2000
          default: 500
          description: >-
            Minimum speech duration (ms) before the caller's speech is
            registered as an interruption. Lower values make the agent easier to
            interrupt. Range: 100-2000, default 500.
        transferMode:
          type: string
          enum:
            - cold
            - warm
          description: >-
            Transfer mode. `cold` disconnects the AI before connecting to the
            destination. `warm` keeps the AI on the line to introduce the
            caller.
        warmTransferConfig:
          type: object
          nullable: true
          description: >-
            Configuration for warm transfers (only used when transferMode is
            `warm`)
          properties:
            holdMessage:
              type: string
              maxLength: 500
              description: Message played to the caller while on hold
            holdMusicEnabled:
              type: boolean
              description: Whether to play hold music while the caller waits
            summaryPrompt:
              type: string
              maxLength: 2000
              description: >-
                Prompt used to generate a conversation summary for the human
                agent
            introMessage:
              type: string
              maxLength: 500
              description: >-
                Message the AI speaks to the human agent before connecting the
                caller
            continueRecordingAfterTransfer:
              type: boolean
              description: >-
                Keep recording after the warm handoff completes, so the
                recording also includes the human agent and caller conversation.
        playKeypadTouchToneEnabled:
          type: boolean
          description: >-
            Enable the keypad input (DTMF) tool, allowing callers to press phone
            keys during the conversation
        playKeypadTouchToneDescriptionOverride:
          type: string
          maxLength: 2000
          nullable: true
          description: Custom instructions for the keypad input tool behavior
        knowledgeBaseRetrievalMode:
          type: string
          enum:
            - automatic
            - query_tool
          description: >-
            How the agent queries linked knowledge bases. `automatic` retrieves
            context on every turn. `query_tool` lets the agent decide when to
            search.
        knowledgeBaseChunks:
          type: integer
          minimum: 1
          maximum: 20
          description: Number of text chunks to retrieve per knowledge base query
        knowledgeBaseSimilarityThreshold:
          type: number
          minimum: 0
          maximum: 1
          description: >-
            Minimum similarity score for retrieved chunks (0-1). Higher values
            return only highly relevant results.
      required:
        - id
        - name
        - status
        - promptTemplate
        - createdAt
        - updatedAt
    MessagingConfig:
      type: object
      description: Per-agent messaging settings. A JSON object; set only the keys you need.
      properties:
        smsPrompt:
          type: string
          description: >-
            Optional instructions for composing text replies. If omitted, the
            agent uses its main prompt. Set it to give texting its own tone,
            separate from the call prompt.
        inboundMode:
          type: string
          enum:
            - auto_reply
            - notify
          description: >-
            What happens when someone texts in: 'auto_reply' (RevRing composes
            and sends a reply from smsPrompt) or 'notify' (RevRing forwards the
            message to inboundWebhookUrl and you send the reply).
        inboundWebhookUrl:
          type: string
          description: Where RevRing POSTs incoming texts when inboundMode is 'notify'.
        fromNumber:
          type: string
          description: >-
            Default sender number in E.164. If unset, the connection's Messaging
            Service chooses the sender.
        sendMessageEnabled:
          type: boolean
          description: Allow the agent to send a text during a live call.
        sendMessageDescriptionOverride:
          type: string
          description: Custom instructions for when and how the agent texts during a call.
        conversationIdleResetDays:
          type: integer
          description: >-
            Days of inactivity after which earlier conversation history is no
            longer used as reply context. Defaults to 30.
    WidgetConfig:
      type: object
      description: >-
        Per-agent website chat widget settings. A JSON object; set only the keys
        you need. Enabling the widget the first time mints a public embed key
        (returned as the read-only 'widgetKey' on the agent).
      properties:
        enabled:
          type: boolean
          description: >-
            Whether the website chat widget is live. When true, the widget loads
            on the allowed domains.
        modes:
          type: object
          description: >-
            Which interaction modes the widget offers. Chat is always on; voice
            is opt-in.
          properties:
            chat:
              type: boolean
              description: Text chat (always available; defaults to true).
            voice:
              type: boolean
              description: >-
                In-browser voice calls. Adds a call button to the widget.
                Defaults to false.
        continuity:
          type: object
          description: Continue-mode behaviors for voice widget calls. Both default true.
          properties:
            resumeCalls:
              type: boolean
              description: >-
                A voice call survives the visitor navigating to another page or
                reloading (it resumes the same call), and silently redials if it
                fully dropped. Default true. False = a navigation ends the call,
                like a normal phone call.
            sharedMemory:
              type: boolean
              description: >-
                Chat and voice share one visitor memory: a call knows the chat
                history and later chat knows the call. Default true. False =
                chat and voice stay separate.
        allowedDomains:
          type: array
          items:
            type: string
          description: >-
            Hostnames the widget may run on (e.g. 'www.example.com'). Subdomains
            are listed separately. Requests from any other origin are refused.
        webchatPrompt:
          type: string
          description: >-
            Optional instructions for composing web chat replies. If omitted,
            the agent uses its main prompt. Set it to give website chat its own
            tone, separate from calls and texting.
        appearance:
          type: object
          description: Visual customization for the widget.
          properties:
            position:
              type: string
              enum:
                - bottom-right
                - bottom-left
                - top-right
                - top-left
              description: Corner the launcher bubble sits in. Defaults to 'bottom-right'.
            accentColor:
              type: string
              description: >-
                Brand color as a 3- or 6-digit hex (e.g. '#1a56db'). Defaults to
                '#1a56db'.
            theme:
              type: string
              enum:
                - light
                - dark
                - auto
              description: >-
                Color theme. 'auto' follows the visitor's device. Defaults to
                'auto'.
            launcherLabel:
              type: string
              description: Text on the launcher bubble. Defaults to 'Chat with us'.
            agentDisplayName:
              type: string
              description: Name shown in the chat header. Defaults to the agent's name.
            avatarUrl:
              type: string
              description: Image URL shown as the agent avatar.
            welcomeMessage:
              type: string
              description: Message shown when a visitor opens the chat for the first time.
            chatPlaceholder:
              type: string
              description: >-
                Placeholder text in the message input. Defaults to 'Type a
                message...'.
        limits:
          type: object
          description: Usage limits for the widget.
          properties:
            messagesPerDay:
              type: integer
              description: >-
                Maximum visitor messages answered per conversation per rolling
                day. Defaults to 300.
    AgentPhoneNumber:
      type: object
      properties:
        id:
          type: string
          format: uuid
        e164:
          type: string
          pattern: ^\+[1-9]\d{1,14}$
          description: Phone number in E.164 format
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - id
        - e164
        - createdAt
        - updatedAt
    AgentCustomTool:
      type: object
      description: Custom function calling tool for agents
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
          description: Tool name (used in function calls)
        webhookUrl:
          type: string
          format: uri
          description: Webhook URL to invoke
        enabled:
          type: boolean
        schema:
          type: object
          description: OpenAI function schema defining parameters
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        httpMethod:
          type: string
          enum:
            - GET
            - POST
            - PUT
            - PATCH
            - DELETE
          description: HTTP method used when calling the webhook. Defaults to `POST`.
        headers:
          type: array
          nullable: true
          description: Custom HTTP headers to include in webhook requests
          items:
            $ref: '#/components/schemas/KeyValuePair'
        queryParams:
          type: array
          nullable: true
          description: Custom query parameters appended to the webhook URL
          items:
            $ref: '#/components/schemas/KeyValuePair'
        sendRawRequestBody:
          type: boolean
          description: >-
            When true, sends tool arguments directly as the request body instead
            of the default wrapper
      required:
        - id
        - name
        - webhookUrl
        - enabled
        - createdAt
        - updatedAt
    KeyValuePair:
      type: object
      description: A key-value pair
      properties:
        key:
          type: string
          description: Header or parameter name
        value:
          type: string
          description: Header or parameter value
      required:
        - key
        - value
  responses:
    UnauthorizedError:
      description: Authentication required or API key invalid
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: unauthorized
    BillingInactiveError:
      description: Subscription inactive or billing issue
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: billing_inactive
    NotFoundError:
      description: Resource not found
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: not_found
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API key for authentication. Generate API keys from the RevRing
        dashboard.

````