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

# Create a Routing Form

> Create a routing form with the Zeeg API, setting its name, headline, body, submit button and colours, and returning the form with its default fallback route.

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

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

Creates a routing form in your workspace and returns it in the shape that [Get a Routing Form](/api/routing-forms/get-a-routing-form) returns.

`name` is the only required field. It is the internal name, which an invitee never reads.

The new routing form holds no question and one fallback route that shows the default thank-you page. Add the questions with [Replace Routing Form Questions](/api/routing-forms/replace-routing-form-questions) and the routes with [Replace Routing Form Routes](/api/routing-forms/replace-routing-form-routes).

<Note>
  The response carries `slug` and `url`. `url` is the public address at which an invitee opens the routing form. An inactive routing form accepts no submission at that address.
</Note>

<Warning>
  Your subscription caps how many routing forms your workspace holds. If the workspace already holds that many, the call answers `422` and writes no routing form.
</Warning>


## OpenAPI

````yaml POST /routing-forms
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:
    post:
      tags:
        - Routing Forms - Forms
      summary: Create a routing form
      description: >-
        Creates a routing form in your workspace and returns it in the shape
        that `GET /routing-forms/{id}` returns.


        The new routing form holds no question and one fallback route that shows
        the default thank-you page. Add the questions with `PUT
        /routing-forms/{id}/inputs` and the routes with `PUT
        /routing-forms/{id}/routes`.


        Your subscription caps how many routing forms your workspace holds. If
        the workspace already holds that many, the call answers 422 and writes
        no routing form.


        **Required scope:** `routing_forms:write`
      operationId: create-routing-form
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RoutingFormCreateRequest'
            examples:
              Name only:
                value:
                  name: Inbound Lead Qualification
              Full body:
                value:
                  name: Inbound Lead Qualification
                  headline: Tell us about your team
                  body: >-
                    <p>Answer three questions and we send you to the right
                    person.</p>
                  submitBtnText: Continue
                  isActive: true
                  styleSettings:
                    bgColor: '#ffffff'
                    buttonBgColor: '#1f2937'
                    buttonTextColor: '#ffffff'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  status:
                    type: integer
                    example: 201
                  routingForm:
                    $ref: '#/components/schemas/RoutingFormDetail'
              examples:
                Success:
                  value:
                    success: true
                    status: 201
                    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-01T09:12:44+00:00'
                      inputs: []
                      routes:
                        - id: 2e7f4b90-8a13-4c6d-b5e2-7f0a9c3d1e64
                          type: CUSTOM_PAGE
                          isFallback: true
                          order: 0
                          customUrl: null
                          headline: Thank you for your interest
                          body: We get back to you as soon as possible.
                          eventType: null
                          team: null
                          rules: []
        '401':
          $ref: '#/components/responses/401'
        '403':
          description: >-
            Forbidden — the token misses the scope, or the user may not create a
            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 are not a user of this organization.
                    status: 403
        '422':
          description: >-
            Unprocessable Entity — the body is invalid, or the subscription
            allows no further routing form
          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:
                Invalid body:
                  value:
                    message: The name field is required.
                    errors:
                      name:
                        - The name field is required.
                Allowance reached:
                  value:
                    success: false
                    message: >-
                      You have reached the maximum of 3 routing forms for your
                      subscription.
                    status: 422
      security:
        - bearer: []
components:
  schemas:
    RoutingFormCreateRequest:
      type: object
      description: The body that creates a routing form.
      required:
        - name
      properties:
        name:
          type: string
          maxLength: 200
          description: The internal name of the routing form. An invitee never reads it.
          example: Inbound Lead Qualification
        headline:
          type: string
          nullable: true
          description: >-
            The headline above the questions. It holds rich text of at most 200
            visible characters.
          example: Tell us about your team
        body:
          type: string
          nullable: true
          description: >-
            The body text below the headline. It holds rich text of at most 2000
            visible characters.
          example: <p>Answer three questions and we send you to the right person.</p>
        submitBtnText:
          type: string
          nullable: true
          maxLength: 200
          description: The label of the submit button.
          example: Continue
        isActive:
          type: boolean
          default: true
          description: An inactive routing form accepts no submission.
          example: true
        styleSettings:
          $ref: '#/components/schemas/RoutingFormStyleSettings'
    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'
    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'
    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
    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: ''

````