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

# Duplicate Event

> **Tool name:** `v1_duplicate_event` · **Behaviour:** ✏️ Write

Duplicate an existing Zuddl event into a new one. PREVIEW-FIRST and two-step: call it WITHOUT confirm to validate and get the summary, show that summary to the user, and only call again with confirm=true after they reply with an explicit yes. Never pass confirm=true on the first call, and never infer consent from the original request.
Which fields are mandatory depends on the SOURCE event, so do not assume: a NEEDS_INPUT response lists every missing field at once -- ask the user for all of them in a single turn, then call again. When a violation carries options, those are the ONLY valid values: present them to the user as a numbered choice and pass back the chosen option's value. Never invent a value for a field that came with options, and never pick one on the user's behalf.
summary.values tags each value SUPPLIED, PREFILLED_FROM_SOURCE or DEFAULT. Read back every PREFILLED_FROM_SOURCE and DEFAULT value explicitly, say where it came from, and invite the user to change it before they confirm -- the timezone and the end time in particular were chosen by the system, not by them. Never present a system-chosen value as though the user asked for it.
identifier is the new event's URL slug. The setup UI prefills it from the title and lets the user edit it, so do the same: derive a slug from the new title, show it, and send what they agree to. Leave it out only if they do not care, in which case the server appends a random suffix.
status: NEEDS_INPUT (mandatory fields missing -- see violations), NEEDS_CONFIRMATION (complete; show summary and automationNotices, then get an explicit yes), STARTED (queued; the new event exists but duplication is still running. Wait pollAfterSeconds (10s), then call get_event_duplication_status with newEventId, re-checking every nextPollInSeconds (10s) until terminal is true. Keep polling until it is terminal -- do NOT stop after one PENDING and leave the user without an outcome. Never report success before duplicationStatus is SUCCESS, and always give the user newEventUrl in the final message).
Report the values used and the defaults applied. Do not report the Salesforce campaign, HubSpot marketing event, or Marketo program objects -- only announce, from automationNotices, that they are being created.

**MCP-only:** this tool has no equivalent Public API endpoint.



## OpenAPI

````yaml https://api.prod.zuddl.com/api/v3/api-docs/mcp-tools post /tools/v1_duplicate_event
openapi: 3.1.0
info:
  title: Zuddl MCP Tools Reference
  description: >-
    The Zuddl MCP server lets AI assistants such as Claude and ChatGPT work with
    your Zuddl organization through the [Model Context
    Protocol](https://modelcontextprotocol.io). This reference lists every tool
    the server offers. It is generated from the live server, so it always
    matches what your assistant sees.


    # Connecting


    Add `https://setup.zuddl.com/api/mcp` as a remote MCP server in your
    assistant. It signs you in to Zuddl with OAuth and then calls tools on your
    behalf, with your permissions. AI features must be enabled for your
    organization.


    # Calling a tool


    Assistants call a tool with a JSON-RPC `tools/call` request whose `name` is
    the tool name and whose `arguments` match the request body documented on the
    tool's page. The `/tools/<name>` paths in this reference identify tools;
    they are not HTTP endpoints.


    # Behaviour labels


    | Label | Meaning |

    | --- | --- |

    | 🔒 Read-only | Reads data and changes nothing. |

    | ✏️ Write | Creates or updates data, but does not delete it. |

    | ⚠️ Destructive | Deletes or removes data. Most assistants ask you to
    approve these calls. |

    | 🔁 Idempotent | Calling it again with the same arguments has no further
    effect. |


    A tool that mirrors a Public API endpoint links to that endpoint's page.
    MCP-only tools have no Public API equivalent.
  version: 1.0.0
servers:
  - url: https://setup.zuddl.com/api/mcp
    description: Zuddl MCP server
security:
  - oauth: []
tags:
  - name: Events
  - name: Attendees
  - name: Sessions
  - name: Speakers
  - name: Sponsors
  - name: Locations
  - name: Teams
  - name: Brand Kits
  - name: Registration flows & tickets
  - name: Analytics
paths:
  /tools/v1_duplicate_event:
    post:
      tags:
        - Events
      summary: Duplicate Event
      description: >-
        **Tool name:** `v1_duplicate_event` · **Behaviour:** ✏️ Write


        Duplicate an existing Zuddl event into a new one. PREVIEW-FIRST and
        two-step: call it WITHOUT confirm to validate and get the summary, show
        that summary to the user, and only call again with confirm=true after
        they reply with an explicit yes. Never pass confirm=true on the first
        call, and never infer consent from the original request.

        Which fields are mandatory depends on the SOURCE event, so do not
        assume: a NEEDS_INPUT response lists every missing field at once -- ask
        the user for all of them in a single turn, then call again. When a
        violation carries options, those are the ONLY valid values: present them
        to the user as a numbered choice and pass back the chosen option's
        value. Never invent a value for a field that came with options, and
        never pick one on the user's behalf.

        summary.values tags each value SUPPLIED, PREFILLED_FROM_SOURCE or
        DEFAULT. Read back every PREFILLED_FROM_SOURCE and DEFAULT value
        explicitly, say where it came from, and invite the user to change it
        before they confirm -- the timezone and the end time in particular were
        chosen by the system, not by them. Never present a system-chosen value
        as though the user asked for it.

        identifier is the new event's URL slug. The setup UI prefills it from
        the title and lets the user edit it, so do the same: derive a slug from
        the new title, show it, and send what they agree to. Leave it out only
        if they do not care, in which case the server appends a random suffix.

        status: NEEDS_INPUT (mandatory fields missing -- see violations),
        NEEDS_CONFIRMATION (complete; show summary and automationNotices, then
        get an explicit yes), STARTED (queued; the new event exists but
        duplication is still running. Wait pollAfterSeconds (10s), then call
        get_event_duplication_status with newEventId, re-checking every
        nextPollInSeconds (10s) until terminal is true. Keep polling until it is
        terminal -- do NOT stop after one PENDING and leave the user without an
        outcome. Never report success before duplicationStatus is SUCCESS, and
        always give the user newEventUrl in the final message).

        Report the values used and the defaults applied. Do not report the
        Salesforce campaign, HubSpot marketing event, or Marketo program objects
        -- only announce, from automationNotices, that they are being created.


        **MCP-only:** this tool has no equivalent Public API endpoint.
      operationId: v1_duplicate_event
      requestBody:
        description: The tool's `arguments`, as sent in a JSON-RPC `tools/call` request.
        content:
          application/json:
            schema:
              type: object
              properties:
                eventId:
                  type: string
                  description: >-
                    The Zuddl event ID (UUID) to duplicate. Always supplied by
                    the user -- never inferred from a linked Slack/Teams
                    channel. Source it from a prior search_event call when the
                    user names an event instead of giving an ID.
                request:
                  type: object
                  description: >-
                    The new event's settings. title, startDateTime, endDateTime
                    and tz are always required; description is additionally
                    required when the source event is a FIELD or WEBINAR event;
                    externalSession.externalAccountId is required when the
                    source is a Zoom-hosted webinar. Set addressDetails only
                    from a place the user explicitly picked, never from raw
                    prompt text.
                  properties:
                    addressDetails:
                      type: object
                      description: >-
                        Venue for the new event. Set ONLY from a place
                        suggestion the user explicitly picked -- never from raw
                        prompt text. Omit to create the event with no venue.
                      properties:
                        city:
                          type: string
                          description: City.
                        country:
                          type: string
                          description: Country.
                        latitude:
                          type: string
                          description: Latitude of the picked place.
                        locality:
                          type: string
                          description: Street / locality line.
                        longitude:
                          type: string
                          description: Longitude of the picked place.
                        mapLink:
                          type: string
                          description: Map link for the picked place.
                        name:
                          type: string
                          description: >-
                            Complete address of the venue, as returned by the
                            place lookup.
                        placeId:
                          type: string
                          description: Google Places place_id for the picked suggestion.
                        placeTitle:
                          type: string
                          description: Venue or property name, e.g. the hotel name.
                        postalCode:
                          type: string
                          description: Postal or ZIP code.
                        state:
                          type: string
                          description: State or province.
                      required:
                        - name
                    communicationToggleValues:
                      type: boolean
                      description: >-
                        Carry each communication's enabled/disabled toggle state
                        to the new event. Defaults to false: content and
                        settings are duplicated but every toggle starts off.
                        Only honoured for FIELD and WEBINAR sources.
                    components:
                      type: object
                      description: >-
                        Which parts of the source event to duplicate. Omit to
                        duplicate everything applicable to this event type.
                      properties:
                        accessGroups:
                          type: boolean
                          description: >-
                            Duplicate access groups. Defaults to true. Standard
                            events only.
                        communication:
                          type: boolean
                          description: >-
                            Duplicate communications. Defaults to true. Standard
                            events only.
                        eventSetup:
                          type: boolean
                          description: >-
                            Duplicate event setup. Defaults to true. Standard
                            events only.
                        registration:
                          type: boolean
                          description: >-
                            Duplicate the registration form and settings.
                            Defaults to true.
                        venueSetup:
                          type: boolean
                          description: Duplicate venue setup. Defaults to true.
                    description:
                      type: string
                      description: >-
                        Description for the new event. REQUIRED when the source
                        event is a FIELD or WEBINAR event; optional otherwise.
                    endDateTime:
                      type: string
                      format: date-time
                      description: >-
                        End of the new event, ISO-8601 with offset. Must be
                        after startDateTime. Omit to keep the source event's
                        duration.
                    externalSession:
                      type: object
                      description: >-
                        External (Zoom) session setup. REQUIRED when the source
                        event is a Zoom-hosted webinar; omit otherwise.
                      properties:
                        externalAccountId:
                          type: string
                          description: >-
                            The connected Zoom account (Zoom user id) the
                            duplicated webinar binds to. Permanently bound at
                            creation.
                        externalId:
                          type: string
                          description: >-
                            The external platform's session id. Required when
                            setupMode is LINK_EXISTING.
                        passcode:
                          type: string
                          description: >-
                            Session passcode, if one is set on the external
                            platform.
                        sessionType:
                          type: string
                          description: >-
                            MEETING or WEBINAR. Required when setupMode is
                            LINK_EXISTING.
                        setupMode:
                          type: string
                          description: >-
                            CREATE_NEW to provision a new external session,
                            LINK_EXISTING to attach an existing one. Defaults to
                            CREATE_NEW.
                      required:
                        - externalAccountId
                    identifier:
                      type: string
                      description: >-
                        URL identifier (slug) for the new event, e.g.
                        autumn-roadshow-2026. The setup UI prefills this from
                        the title and lets the user edit it, so do the same:
                        derive a slug from the new title, show it, and send what
                        they agree to. 3-128 characters, letters, numbers and
                        hyphens only, unique within the organization. Omit it
                        only if the user does not care — the server then
                        generates one from the title with a random suffix, which
                        is uglier.
                    marketoProgram:
                      type: object
                      description: >-
                        Marketo program setup. REQUIRED when Marketo is active
                        on the source event -- the choice is irreversible, so it
                        is never defaulted. Call duplicate_event without it
                        first: the NEEDS_INPUT violation lists the valid
                        programs to choose from. Not applicable when Marketo is
                        inactive.
                      properties:
                        baseEventIntegrationId:
                          type: string
                          description: >-
                            The chosen option's value, taken VERBATIM from an
                            option returned in the NEEDS_INPUT violation for
                            this field -- either the literal
                            SOURCE_EVENT_PROGRAM or an org base program id.
                            Never pass a program id from anywhere else. Cannot
                            be changed after duplication.
                    salesforceCampaignId:
                      type: string
                      description: >-
                        Salesforce campaign ID for the new event. Not copied
                        from the source. Mandatory for some organizations: when
                        it is, a NEEDS_INPUT violation names it -- ask the user
                        for it, never invent or reuse the source event's.
                    startDateTime:
                      type: string
                      format: date-time
                      description: >-
                        Start of the new event, ISO-8601 with offset, e.g.
                        2026-09-05T10:00:00+05:30.
                    title:
                      type: string
                      description: >-
                        Name for the new event. Omit to reuse the source event's
                        title.
                    tz:
                      type: string
                      description: >-
                        IANA timezone for the new event, e.g. Asia/Kolkata. Ask
                        the user — there is no default. The only value the
                        server could fall back to is its own zone, which is not
                        theirs.
                  required:
                    - startDateTime
                    - tz
                confirm:
                  type: boolean
                  description: >-
                    Omit or false to preview. Pass true ONLY after the user has
                    seen the summary from a previous call and explicitly agreed.
              required:
                - eventId
                - request
        required: true
      responses:
        '200':
          description: A JSON-RPC `tools/call` result. The tool's output is in `content`.
components:
  securitySchemes:
    oauth:
      type: http
      description: >-
        OAuth 2.1 access token. MCP clients obtain it themselves (dynamic client
        registration + PKCE) when you connect them to the server URL above.
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.