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

# Replace Routing Form Questions

> Replace every question of a routing form with the Zeeg API. The write covers the whole list, so a question the body leaves out is deleted.

<Badge color="orange">Alpha</Badge>

This endpoint is in alpha: the request shape may still change without a deprecation cycle.

Replaces every question of one routing form and returns the routing form in the shape that [Get a Routing Form](/api/routing-forms/get-a-routing-form) returns.

## The write covers the whole list

`inputs` holds the complete question list. This endpoint is not an append and not a patch.

* An entry that carries an `id` updates that stored question in place.
* An entry without an `id` creates a question.
* A stored question that the body leaves out is deleted.

Read the questions first and send them back with your changes. Send the whole list every time.

<Warning>
  When a question is deleted, every route that read it drops the matching condition. A rule that ends up with no condition is cleared, which sends every submission to the fallback. Check the routes after you remove a question.
</Warning>

`inputs` must be present. A body without it answers `422`, so a mistyped key never deletes every question.

Array position sets the question order. The first entry carries order `0`. The `order` that the read endpoint returns is ignored on write.

## Question types

`type` takes `TEXT_INPUT`, `TEXTAREA`, `SELECT`, `RADIO_INPUT`, `EMAIL`, `PHONE_NUMBER`, `NUMBER_INPUT` or `CRM_ATTRIBUTE`.

A `SELECT` or a `RADIO_INPUT` question needs 1 to 20 `options`. Every other type ignores the field.

A `CRM_ATTRIBUTE` question needs `crmAttribute`, which names the CRM object and the attribute that the answer writes to. Two questions of one routing form must not map onto the same attribute of the same object. [Get a CRM Object](/api/crm/get-a-crm-object) shows which attribute slugs a question maps onto.

<Note>
  The id is a UUID. A malformed id answers `404`, not `422`. A routing form outside your workspace answers `404` as well.
</Note>


## OpenAPI

````yaml PUT /routing-forms/{id}/inputs
openapi: 3.0.0
info:
  title: Zeeg Public API
  description: >-
    Zeeg public API documentation.


    ## Authentication

    All endpoints require a Bearer token. You can generate an API token from
    [your Zeeg dashboard](https://app.zeeg.me/account/settings/api-access).


    Each token is scoped to specific permissions (e.g. `events:read`,
    `webhooks:write`). Make sure your token has the required scopes for the
    endpoints you want to use.


    ## Recommended Headers

    We recommend including the `Accept: application/json` header in all API
    requests to ensure you receive JSON responses.
  version: 2.0.0
  x-logo:
    url: https://app.zeeg.me/img/logo-dark.2ca83593.svg
    backgroundColor: '#f7f7f9'
    altText: zeeg
  contact:
    name: Zeeg Support
    email: support@zeeg.me
    url: https://zeeg.me/en/contact
  license:
    name: Proprietary
    url: https://zeeg.me/en/legal/terms
  termsOfService: https://zeeg.me/en/legal/terms
servers:
  - url: https://api.zeeg.me/v2
    description: Production
security:
  - bearer: []
tags:
  - name: Scheduled Events
    description: Management of events scheduled via Zeeg
  - name: Scheduling Pages
    description: Scheduling pages information and management
  - name: Availability Schedule
    description: Read and change availability for users
  - name: Webhooks
    description: Webhooks management
  - name: Notes
    description: Notes for scheduled events
  - name: Workspaces & Teams
    description: Workspace users and team member management
  - name: AI Agent
    description: AI Agent integration endpoints
  - name: Payloads
    description: Webhook payload schemas
  - name: CRM - Objects
    description: >-
      Discover the schema of CRM objects (standard and custom) including all
      attribute definitions
  - name: CRM - Companies
    description: Create, read, update, and delete CRM company records
  - name: CRM - People
    description: Create, read, update, and delete CRM person records
  - name: Routing Forms - Forms
    description: Read routing forms with their questions and their routes
  - name: Routing Forms - Submissions
    description: Read and delete the submissions that invitees send through a routing form
paths:
  /routing-forms/{id}/inputs:
    put:
      tags:
        - Routing Forms - Forms
      summary: Replace the questions of a routing form
      description: >-
        Replaces every question of one routing form and returns the routing form
        in the shape that `GET /routing-forms/{id}` returns.


        The replace covers the whole question list. It is not an append and not
        a patch. A stored question that the body leaves out is deleted, and
        every rule that read that question drops the matching condition. A rule
        that ends up with no condition is cleared. An entry that carries an `id`
        updates that stored question in place, and an entry without an `id`
        creates a question.


        `inputs` must be present. A body without it answers 422 rather than
        deleting every question.


        Array position sets the question order, so the `order` that the read
        endpoint returns is ignored on write.


        A routing form outside your workspace answers 404, so the response never
        tells you that the routing form exists. An id that is not a UUID answers
        404 as well.


        **Required scope:** `routing_forms:write`
      operationId: replace-routing-form-inputs
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID of the routing form.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RoutingFormInputsReplaceRequest'
            examples:
              Two questions:
                value:
                  inputs:
                    - label: What is your company size?
                      type: SELECT
                      isRequired: true
                      options:
                        - 1-10 employees
                        - 50-200 employees
                    - label: Work email
                      type: CRM_ATTRIBUTE
                      isRequired: true
                      crmAttribute:
                        objectSlug: people
                        attributeSlug: emails
              Keep one stored question:
                value:
                  inputs:
                    - id: f7c82298-6dd9-43bd-98e4-c437b5c0ae47
                      label: What is your company size?
                      type: SELECT
                      isRequired: true
                      options:
                        - 1-10 employees
                        - 50-200 employees
              Delete every question:
                value:
                  inputs: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  status:
                    type: integer
                    example: 200
                  routingForm:
                    $ref: '#/components/schemas/RoutingFormDetail'
              examples:
                Success:
                  value:
                    success: true
                    status: 200
                    routingForm:
                      id: f1cbafc4-b646-4cf9-af29-193491b555d9
                      name: Inbound Lead Qualification
                      slug: inbound-lead-qual
                      url: https://zeeg.me/RF/inbound-lead-qual
                      isActive: true
                      headline: Tell us about your team
                      body: null
                      submitBtnText: Continue
                      styleSettings:
                        bgColor: '#ffffff'
                        buttonBgColor: '#1f2937'
                        buttonTextColor: '#ffffff'
                      createdAt: '2026-04-01T09:12:44+00:00'
                      updatedAt: '2026-04-11T11:14:52+00:00'
                      inputs:
                        - id: f7c82298-6dd9-43bd-98e4-c437b5c0ae47
                          label: What is your company size?
                          type: SELECT
                          order: 0
                          isRequired: true
                          isActive: true
                          options:
                            - 1-10 employees
                            - 50-200 employees
                          crmAttribute: null
                      routes: []
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: >-
            Forbidden — the token misses the scope, or the user may not change
            this routing form
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      error:
                        type: object
                        properties:
                          type:
                            type: string
                          message:
                            type: string
                          error_id:
                            type: string
                          required_scopes:
                            type: array
                            items:
                              type: string
                  - type: object
                    properties:
                      success:
                        type: boolean
                      message:
                        type: string
                      status:
                        type: integer
              examples:
                Missing scope:
                  value:
                    error:
                      type: insufficient_scope
                      message: >-
                        Your token is missing the required scope:
                        routing_forms:write.
                      error_id: 9b3c5e71-4d28-4f6a-b0c9-3e7a1d5f8c20
                      required_scopes:
                        - routing_forms:write
                No permission:
                  value:
                    success: false
                    message: You don't have permission to edit this routing form.
                    status: 403
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  status:
                    type: integer
              examples:
                Not found:
                  value:
                    success: false
                    message: Data Not Found
                    status: 404
        '422':
          description: >-
            Unprocessable Entity — the body is invalid, or a CRM mapping does
            not hold
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      message:
                        type: string
                      errors:
                        type: object
                        additionalProperties:
                          type: array
                          items:
                            type: string
                  - type: object
                    properties:
                      success:
                        type: boolean
                      message:
                        type: string
                      status:
                        type: integer
              examples:
                Question type not recognised:
                  value:
                    message: The selected inputs.0.input type is invalid.
                    errors:
                      inputs.0.inputType:
                        - The selected inputs.0.input type is invalid.
                Question list absent:
                  value:
                    message: The inputs field must be present.
                    errors:
                      inputs:
                        - The inputs field must be present.
                CRM attribute not found:
                  value:
                    success: false
                    message: Attribute "industries" not found.
                    status: 422
      security:
        - bearer: []
components:
  schemas:
    RoutingFormInputsReplaceRequest:
      type: object
      description: The body that replaces every question of a routing form.
      required:
        - inputs
      properties:
        inputs:
          type: array
          description: >-
            The complete question list. Array position sets the question order,
            so the first entry carries order `0`.
          items:
            $ref: '#/components/schemas/RoutingFormInputWrite'
    RoutingFormDetail:
      description: >-
        A routing form with its questions and its routes, as returned when you
        fetch one routing form.
      allOf:
        - $ref: '#/components/schemas/RoutingForm'
        - type: object
          properties:
            inputs:
              type: array
              description: >-
                The questions of the routing form, which the invitee answers in
                the given order.
              items:
                $ref: '#/components/schemas/RoutingFormInput'
            routes:
              type: array
              description: >-
                The routes of the routing form. Exactly one route is the
                fallback.
              items:
                $ref: '#/components/schemas/RoutingFormRoute'
    RoutingFormInputWrite:
      type: object
      description: One question in the body that replaces the questions of a routing form.
      required:
        - label
        - type
        - isRequired
      properties:
        id:
          type: string
          format: uuid
          description: >-
            The id of a stored question, which the write then updates in place.
            Leave the id out to create a question.
          example: f7c82298-6dd9-43bd-98e4-c437b5c0ae47
        label:
          type: string
          maxLength: 1024
          description: The question text that the invitee reads.
          example: What is your company size?
        type:
          type: string
          description: The answer control that the routing form shows for this question.
          enum:
            - TEXT_INPUT
            - TEXTAREA
            - SELECT
            - RADIO_INPUT
            - EMAIL
            - PHONE_NUMBER
            - NUMBER_INPUT
            - CRM_ATTRIBUTE
          example: SELECT
        isRequired:
          type: boolean
          description: True when the invitee must answer the question.
          example: true
        isActive:
          type: boolean
          default: true
          description: The routing form hides the question when this is false.
          example: true
        options:
          type: array
          description: >-
            The selectable values. A `SELECT` or a `RADIO_INPUT` question needs
            1 to 20 options. Every other type ignores the field.
          minItems: 1
          maxItems: 20
          items:
            type: string
          example:
            - 1-10 employees
            - 50-200 employees
        crmAttribute:
          type: object
          description: >-
            The CRM attribute that the answer writes to. A `CRM_ATTRIBUTE`
            question needs it. The attribute belongs to a standard CRM object.
            `GET /crm/objects/{slug}` lists the attribute slugs that a question
            maps onto.
          properties:
            objectSlug:
              type: string
              description: Slug of the CRM object that holds the attribute.
              example: people
            attributeSlug:
              type: string
              maxLength: 255
              pattern: ^[a-z0-9_]+$
              description: >-
                Slug of the attribute on that object. Two questions of one
                routing form must not map onto the same attribute of the same
                object.
              example: emails
    RoutingForm:
      type: object
      description: >-
        A routing form, as returned by the list endpoint. The questions and the
        routes ship from the detail endpoint only.
      properties:
        id:
          type: string
          format: uuid
          example: f1cbafc4-b646-4cf9-af29-193491b555d9
        name:
          type: string
          description: The internal name of the routing form.
          example: Inbound Lead Qualification
        slug:
          type: string
          description: The slug that addresses the routing form in its public URL.
          example: inbound-lead-qual
        url:
          type: string
          format: uri
          description: The public address at which an invitee opens the routing form.
          example: https://zeeg.me/RF/inbound-lead-qual
        isActive:
          type: boolean
          description: An inactive routing form accepts no submission.
          example: true
        headline:
          type: string
          nullable: true
          description: The headline that the routing form shows above the questions.
          example: Tell us about your team
        body:
          type: string
          nullable: true
          description: The body text that the routing form shows below the headline.
          example: null
        submitBtnText:
          type: string
          nullable: true
          description: The label on the submit button of the routing form.
          example: Continue
        styleSettings:
          $ref: '#/components/schemas/RoutingFormStyleSettings'
        createdAt:
          type: string
          format: date-time
          nullable: true
          description: Time at which the routing form was created, in UTC.
          example: '2026-04-01T09:12:44+00:00'
        updatedAt:
          type: string
          format: date-time
          nullable: true
          description: Time of the last change to the routing form, in UTC.
          example: '2026-04-10T08:30:00+00:00'
    RoutingFormInput:
      type: object
      description: One question of a routing form.
      properties:
        id:
          type: string
          format: uuid
          example: f7c82298-6dd9-43bd-98e4-c437b5c0ae47
        label:
          type: string
          description: The question text that the invitee reads.
          example: What is your company size?
        type:
          type: string
          description: The answer control that the routing form shows for this question.
          enum:
            - TEXT_INPUT
            - TEXTAREA
            - SELECT
            - RADIO_INPUT
            - EMAIL
            - PHONE_NUMBER
            - NUMBER_INPUT
            - CRM_ATTRIBUTE
          example: SELECT
        order:
          type: integer
          description: >-
            Position of the question in the routing form. The first question
            carries `0`.
          example: 0
        isRequired:
          type: boolean
          description: True when the invitee must answer the question.
          example: true
        isActive:
          type: boolean
          description: The routing form hides the question when this is false.
          example: true
        options:
          type: array
          description: >-
            The selectable values of the question. A `SELECT` or `RADIO_INPUT`
            question carries plain strings. A `CRM_ATTRIBUTE` question carries
            the option objects of the CRM attribute. Every other type carries an
            empty array.
          items:
            oneOf:
              - type: string
              - type: object
          example:
            - 1-10 employees
            - 50-200 employees
        crmAttribute:
          $ref: '#/components/schemas/RoutingFormCrmAttributeReference'
    RoutingFormRoute:
      type: object
      description: >-
        One route of a routing form. A route sends the invitee to a destination
        after the routing form accepts the answers.
      properties:
        id:
          type: string
          format: uuid
          example: c4a1e0d2-5f39-4a7b-8f11-2b6d0c9e7a84
        type:
          type: string
          description: >-
            The kind of destination. `EVENT_TYPE` opens a scheduling page,
            `TEAM_PAGE` opens the page of a team, `URL` redirects to an external
            address, and `CUSTOM_PAGE` shows a message inside the routing form.
          enum:
            - EVENT_TYPE
            - URL
            - CUSTOM_PAGE
            - TEAM_PAGE
          example: EVENT_TYPE
        isFallback:
          type: boolean
          description: >-
            The fallback route takes every submission that matches no other
            route.
          example: false
        order:
          type: integer
          description: >-
            Position of the route in the routing form. The first route carries
            `0`. The routing form takes the first route whose conditions hold.
          example: 0
        customUrl:
          type: string
          nullable: true
          description: >-
            Destination address of a `URL` route. It is `null` for every other
            type.
          example: null
        headline:
          type: string
          nullable: true
          description: Headline of a `CUSTOM_PAGE` route.
          example: Thank you
        body:
          type: string
          nullable: true
          description: Body text of a `CUSTOM_PAGE` route.
          example: A member of the team contacts you within one working day.
        eventType:
          $ref: '#/components/schemas/RoutingFormEventTypeReference'
        team:
          $ref: '#/components/schemas/RoutingFormTeamReference'
        rules:
          description: >-
            The condition tree that selects this route. A node is either a group
            or a condition. A group holds child nodes under `any` for OR, or
            under `all` for AND. A condition holds `inputId`, `operator` and
            `values`. The operator is one of `equals`, `does_not_equal`,
            `is_any_of`, `is_not_any_of`, `contains`, `does_not_contain`,
            `starts_with`, `ends_with`, `greater_than`, `greater_than_or_equal`,
            `less_than`, `less_than_or_equal`, `is_empty` or `is_not_empty`. The
            fallback route carries an empty array, because it needs no
            condition.
          oneOf:
            - type: object
              additionalProperties: true
            - type: array
              items: {}
          example:
            all:
              - inputId: f7c82298-6dd9-43bd-98e4-c437b5c0ae47
                operator: is_any_of
                values:
                  - 50-200 employees
    RoutingFormStyleSettings:
      type: object
      description: >-
        The colours of the public routing form page. Each value is a CSS colour
        of at most 20 characters, or `null` when the routing form sets no
        colour. A response always carries the object with all three keys. The
        write endpoints accept the same shape, so a routing form that you read
        goes straight back to `PATCH /routing-forms/{id}` without reshaping.
      properties:
        bgColor:
          type: string
          nullable: true
          maxLength: 20
          description: Background colour of the page.
          example: '#ffffff'
        buttonBgColor:
          type: string
          nullable: true
          maxLength: 20
          description: Background colour of the submit button.
          example: '#1f2937'
        buttonTextColor:
          type: string
          nullable: true
          maxLength: 20
          description: Text colour of the submit button.
          example: '#ffffff'
    RoutingFormCrmAttributeReference:
      type: object
      nullable: true
      description: >-
        The CRM attribute that a question maps onto. It is `null` when the
        question maps onto no attribute.
      properties:
        objectSlug:
          type: string
          description: Slug of the CRM object that holds the attribute.
          example: companies
        attributeSlug:
          type: string
          description: Slug of the attribute on that object.
          example: industries
    RoutingFormEventTypeReference:
      type: object
      nullable: true
      description: >-
        The event type that a route or a submission points at. It is `null` when
        no event type is set.
      properties:
        id:
          type: string
          format: uuid
          example: 80f46bf5-eb01-4c07-960e-a9a3e18aae5e
        title:
          type: string
          example: 30-Minute Discovery Call
        slug:
          type: string
          example: 30min-discovery-call
        uri:
          type: string
          format: uri
          description: Address of the event type in this API.
          example: >-
            https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e
    RoutingFormTeamReference:
      type: object
      nullable: true
      description: >-
        The team that a route or a submission points at. It is `null` when no
        team is set.
      properties:
        id:
          type: string
          format: uuid
          example: 3d9b1a77-2c58-4e6a-9f30-8b1c5d4e2f6a
        title:
          type: string
          example: Sales EMEA
        slug:
          type: string
          example: sales-emea
  responses:
    '401':
      description: Unauthorized
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Unauthenticated.
          examples:
            Unauthenticated:
              value:
                message: Unauthenticated.
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
      description: ''

````