Chili Piper Concierge API

The concierge API from Chili Piper — 4 operation(s) for concierge.

Operations 6

POST /v1/org/concierge/routers/concierge/list Lists all concierge routers #
POST /v1/org/concierge/logs Reads Concierge Logs #
POST /v1/org/concierge/routers/concierge Create concierge router #
GET /v1/org/concierge/routers/concierge/{routerId} Get concierge router #
PUT /v1/org/concierge/routers/concierge/{routerId} Update concierge router #
DELETE /v1/org/concierge/routers/concierge/{routerId} Remove concierge router #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/chili-piper-concierge-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

chili-piper-concierge-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Chili Piper Concierge API
  version: '1.0'
  description: 'Operations tagged concierge across 6 of this provider''s published API definitions: chili-piper-concierge-debugger-openapi.yaml, chili-piper-concierge-router-builder-openapi.yaml, chili-piper-concierge-router-configuration-openapi.yaml, chili-piper-meeting-inspector-openapi.yaml, chili-piper-no-show-analyzer-openapi.yaml, chili-piper-routing-audit-openapi.yaml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://fire.chilipiper.com/api/fire-edge
  description: Production
security:
- apiKeyAuth: []
tags:
- name: concierge
paths:
  /v1/org/concierge/routers/concierge/list:
    servers:
    - url: https://fire.chilipiper.com/api/fire-edge
      description: Production
    post:
      tags:
      - concierge
      summary: Lists all concierge routers
      description: "[operation: concierge-list-routers]\n\n\n\nREAD-ONLY\n\n\n\nReturns all Concierge routers in the org. A router evaluates inbound lead data and routes to teams/users via rules.\n\n- workspaceId (opt): restrict to one workspace\n\n→\n\n    {routers: [{router: {id (routerId), name, slug, formMapping, settings, routing, meta}, dataFields: [...], workspaceId}]}\n\n  Note: routerId is at routers[N].router.id; slug is at routers[N].router.slug\n\nsee: concierge-logs (audit decisions, needs routerId+workspaceId), concierge-route-by-slug (execute routing, needs slug)"
      operationId: conciergeListRouters
      responses:
        '200':
          description: ''
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConciergeRoutersListResponse'
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - concierge.read
  /v1/org/concierge/logs:
    servers:
    - url: https://fire.chilipiper.com/api/fire-edge
      description: Production
    post:
      tags:
      - concierge
      summary: Reads Concierge Logs
      description: '[operation: concierge-logs]




        READ-ONLY




        Fetches aggregated Concierge routing decision logs for a router in a time window (parallelism=4). Max window: 30 days.


        - workspaceId (req): query param; use workspace-list or concierge-list-routers


        - routerId (req): query param; use concierge-list-routers (routers[N].router.id)


        - start, end (req): query params; ISO-8601; max 30-day span


        → array of log entries, each with fields: id, status, trigger, assignments, triggeredAt, crmUrl, guestEmail, actionsStatus, sourceUrl, meetingId, routing, matchedPath (payload structure may change)


        see: concierge-list-routers (find routerId+workspaceId)'
      operationId: conciergeLogs
      parameters:
      - name: workspaceId
        in: query
        description: Id of the workspace
        required: true
        schema:
          type: string
          pattern: '[^\s\\/]+'
      - name: routerId
        in: query
        description: Concierge Router Id
        required: true
        schema:
          type: string
          format: uuid
      - name: start
        in: query
        description: time of start such as 2025-01-08T13:46:18.681Z (ISO8601 format)
        required: true
        schema:
          type: string
          format: date-time
      - name: end
        in: query
        description: time of end such as 2025-01-14T13:46:18.681Z (ISO8601 format)
        required: true
        schema:
          type: string
          format: date-time
      responses:
        '200':
          description: Concierge logs. Payload structure might change.
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
          content:
            application/json:
              schema: {}
        '400':
          description: 'Invalid value for: query parameter workspaceId, Invalid value for: query parameter routerId, Invalid value for: query parameter start, Invalid value for: query parameter end'
          content:
            text/plain:
              schema:
                type: string
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - logs.read
  /v1/org/concierge/routers/concierge:
    servers:
    - url: https://fire.chilipiper.com/api/fire-edge
      description: Production
    post:
      tags:
      - concierge
      summary: Create concierge router
      description: "[operation: concierge-router-create]\n\n\n\nMUTATING\n\n\n\nCreates a Concierge router and publishes it live in one step — there is no unpublished-draft state via the API. workspaceId must be a team workspace of this tenant (400 otherwise). The URL slug is derived from name on publish (there is no separate slug field). Triggers are a PRODUCT of optional kinds — set any combination of form (the Chili webform), inAppButton, and routerLink; supplying NONE auto-generates a minimal email-only Chili webform. A routerLink is what gives the router a shareable Router Link URL. branding and localizations are optional.\n\n- routing (req): ordered rules evaluated top-down, plus a mandatory catch-all fallback. Each row's rule, when it matches, runs that row's `outcome`; the catch-all `outcome` runs when no row matches:\n\n    {routes: [{ruleId, outcome}], catchAll: outcome}\n\n  outcome (one of):\n\n    {type: \"Schedule\", assignment, meetingTypeId, timeout?, crmActions?}\n    {type: \"Redirect\", url}\n\n  Schedule assigns the lead and books a meeting type. assignment is {type: \"Distribution\", distributionId} (round-robin / ownership / whatever the distribution does) or {type: \"User\", userId} (a specific host). timeout (opt) {minutes, onTimeout} sets the no-show fallback; onTimeout is {type: \"Landing\"} or {type: \"Url\", url}; omit timeout for the default (10 min → Landing). crmActions (opt) is an ordered post-booking chain, each {type: \"ConvertLead\"} or {type: \"Notify\", slackChannel?} (omit slackChannel to notify the assigned host instead of a named channel). Redirect sends the lead to a URL instead of booking. ruleId is required on every row; an always-match route is the catchAll. routes may be empty (then only the catchAll applies).\n\n- form (opt): the Chili-hosted guest form fields the lead fills in; MUST include the email field (PersonEmail) or the create is rejected. Omit for a default email-only form:\n\n    [{dataField, label, description?, required?, hidden?}]\n\n  Note: dataField is a CRM data-field reference — a default field name (e.g. PersonEmail, PersonFirstName) or a custom-field UUID; a made-up name is rejected (400). label is the field's display name; required toggles whether the guest must fill it. hidden (opt) is a PREFILLED value (a string) stored on the field but NOT shown to the guest — it is a value, not a show/hide flag; omit it for a normal visible field.\n\n- inAppButton (opt): an in-app-button trigger — the data fields the button collects; MUST include the email field (PersonEmail):\n\n    [{dataField}]\n\n- routerLink (opt): a router-link trigger — gives the router a shareable Router Link URL; the fields its form collects; MUST include the email field (PersonEmail):\n\n    [{dataField, label, required?, hidden?}]\n\n  Note: dataField/label/required/hidden are as for form. A router-link field's enrichment waterfall is not settable via the API (preserved if already configured in the Concierge app).\n\n- branding (opt): the booking page's cover/heading/language — {coverImage?, headingText?, language?}\n\n- localizations (opt): per-language text overrides — {\"<lang-tag>\": {\"<key>\": \"<text>\"}}\n\n→\n\n    {id, workspaceId, name?, slug?, routing: {known, representable, rows: [{ruleId?, ruleType?, outcome}], catchAll?: {outcome}}, form?, inAppButton?, routerLink?, branding?, localizations?}\n\n  Note: the returned routing is the lossy per-row summary (same shape as concierge-router-get), not the matrix you sent; form/inAppButton/routerLink/branding/localizations echo the created config (same shape as concierge-router-get)\n\n⚠ if the final publish step fails the router is left behind as an UNPUBLISHED draft (typed 422); retrying the create mints ANOTHER draft — fix or delete the leftover in the Concierge app\n\nsee: concierge-list-routers (find a workspaceId), rule-list (find ruleIds), distribution-list (find distributionIds), user-find (find userIds), meeting-type-list (find meetingTypeIds), concierge-router-update (replace config afterwards)"
      operationId: conciergeRouterCreate
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConciergeRouterCreate'
        required: true
      responses:
        '200':
          description: ''
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConciergeRouter'
        '400':
          description: 'Invalid value for: body'
          content:
            text/plain:
              schema:
                type: string
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - concierge.create
  /v1/org/concierge/routers/concierge/{routerId}:
    servers:
    - url: https://fire.chilipiper.com/api/fire-edge
      description: Production
    get:
      tags:
      - concierge
      summary: Get concierge router
      description: "[operation: concierge-router-get]\n\n\n\nREAD-ONLY\n\n\n\nFetches one Concierge router: its identity, a lossy per-row summary of its routing, and its full-config dimensions (guest form, branding/cover, localizations). Call this before concierge-router-update to check routing.representable and form.representable — they tell you whether an update would be accepted or rejected as unrepresentable.\n\n→\n\n    {id, workspaceId, name?, slug?, routing: {known, representable, rows: [{ruleId?, ruleType?, outcome}], catchAll?: {outcome}}, form?, inAppButton?, routerLink?, branding?, localizations?}\n    outcome (one of): {type: \"Schedule\", distributionId?, userId?, meetingTypeId?} | {type: \"Redirect\", url?} | {type: \"OwnerAssign\"} | {type: \"ContactOptions\"} | {type: \"CrmAction\"} | {type: \"Other\", kind}\n    form: {representable, fields: [{dataField, label, description?, required, hidden?}], readOnlyTriggers: [string]}\n    inAppButton: {fields: [{dataField}]}\n    routerLink: {fields: [{dataField, label, required, hidden?}]}\n    branding: {coverImage?, headingText?, language?}\n    localizations: {\"<lang-tag>\": {\"<key>\": \"<text>\"}}\n\n  Note: the routing summary is lossy by design — it NAMES each row's outcome (including ones Edge can't itself produce, e.g. Redirect/CrmAction) so you can see what the router does even when it was built in the app\n\n  Note: routing.representable is true only when the current routing — both the draft tree and the published tree — is exactly what Edge's create/update would have produced; when false, an update with a new routing may be rejected (edit it in the Concierge app instead). A router that has no routing tree yet also reports representable=false, but an update setting routing on it is still accepted (nothing is destroyed).\n\n  Note: form.representable is true only when the router's webform is a Chili form (or absent) — only then is a form update accepted. form.fields lists the editable Chili-form fields; form.readOnlyTriggers names trigger kinds Edge doesn't edit here (only ThirdPartyForm — a third-party webform). inAppButton/routerLink (when present) are the router's in-app-button / router-link triggers and ARE editable via concierge-router-update. branding/localizations are absent when unset.\n\nsee: concierge-list-routers (browse to find a routerId), concierge-router-update (replace routing/form/branding/localizations)"
      operationId: conciergeRouterGet
      parameters:
      - name: routerId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: ''
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConciergeRouter'
        '400':
          description: 'Invalid value for: path parameter routerId'
          content:
            text/plain:
              schema:
                type: string
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - concierge.read
    put:
      tags:
      - concierge
      summary: Update concierge router
      description: "[operation: concierge-router-update]\n\n\n\nMUTATING — IDEMPOTENT\n\n\n\nEdits a Concierge router and republishes it live. Only the fields you supply change; omitted fields (and config dimensions Edge doesn't model, e.g. third-party webforms, router-link enrichment waterfalls, and CRM-upsert settings) are preserved. Supplying name re-derives the URL slug. Each dimension you send is a full replace, except branding which merges per sub-field (see below). Triggers are a product of optional kinds: form (Chili webform), inAppButton, and routerLink each replace only their own kind — writing one never destroys the others. Call concierge-router-get first to check routing.representable / form.representable.\n\n- routing (opt): when present, fully REPLACES the routing matrix (not a partial merge); when omitted, the current routing is kept. Each row's rule, when it matches, runs that row's `outcome`; the catch-all `outcome` runs when no row matches:\n\n    {routes: [{ruleId, outcome}], catchAll: outcome}\n\n  outcome (one of):\n\n    {type: \"Schedule\", assignment, meetingTypeId, timeout?, crmActions?}\n    {type: \"Redirect\", url}\n\n  Schedule assigns the lead and books a meeting type. assignment is {type: \"Distribution\", distributionId} or {type: \"User\", userId}. timeout (opt) {minutes, onTimeout} sets the no-show fallback; onTimeout is {type: \"Landing\"} or {type: \"Url\", url}; omit timeout for the default (10 min → Landing). crmActions (opt) is an ordered post-booking chain, each {type: \"ConvertLead\"} or {type: \"Notify\", slackChannel?} (omit slackChannel to notify the assigned host instead of a named channel). Redirect sends the lead to a URL instead of booking. ruleId is required on every row; an always-match route is the catchAll. routes may be empty (then only the catchAll applies).\n\n- form (opt): when present, fully REPLACES the guest form with a Chili form built from these fields (the in-app-button / router-link triggers, if any, are preserved); MUST include the email field (PersonEmail). Omit to keep the current form:\n\n    [{dataField, label, description?, required?, hidden?}]\n\n  Note: dataField is a CRM data-field reference — a default field name (e.g. PersonEmail, PersonFirstName) or a custom-field UUID; a made-up name is rejected (400). label is the field's display name; required toggles whether the guest must fill it. hidden (opt) is a PREFILLED value (a string) stored on the field but NOT shown to the guest — it is a value, not a show/hide flag; omit it for a normal visible field.\n\n- inAppButton (opt): when present, fully REPLACES the in-app-button trigger's fields (the form/router-link triggers, if any, are preserved); MUST include the email field (PersonEmail). Omit to keep the current button:\n\n    [{dataField}]\n\n- routerLink (opt): when present, fully REPLACES the router-link trigger's fields (the form/in-app-button triggers, if any, are preserved); MUST include the email field (PersonEmail). Omit to keep the current link:\n\n    [{dataField, label, required?, hidden?}]\n\n  Note: a router-link field's enrichment waterfall is not settable via the API; an existing one is preserved (matched by dataField) across the replace.\n\n- branding (opt): the cover/heading/language. Merged PER SUB-FIELD: a sub-field you supply is replaced; one you omit is PRESERVED (so a partial {headingText} does not wipe coverImage/language). localizations are preserved. To clear a sub-field entirely, edit the router in the Concierge app. — {coverImage?, headingText?, language?}\n\n- localizations (opt): when present, fully REPLACES the per-language overrides (preserving branding) — {\"<lang-tag>\": {\"<key>\": \"<text>\"}}\n\n→\n\n    {id, workspaceId, name?, slug?, routing: {known, representable, rows: [{ruleId?, ruleType?, outcome}], catchAll?: {outcome}}, form?, inAppButton?, routerLink?, branding?, localizations?}\n\n  Note: the returned routing is the lossy per-row summary (same shape as concierge-router-get), not the matrix you sent\n\n⚠ full-replace + publishes live immediately: supplying routing/form/inAppButton/routerLink/localizations replaces that ENTIRE dimension, not a partial merge (branding is the exception — it merges per sub-field, see above)\n\n⚠ routing REJECTED (409) when the router's existing routing — its DRAFT tree or its PUBLISHED tree — isn't representable in this simplified model (advanced routing built in the Concierge app — owner-assign, contact-options / multiple-choice, call-rep, multiple assignees per row, CRM actions beyond convert-lead / Slack-notify, enrichment or spam-check steps, etc.) — to avoid silently destroying it, edit those routers in the Concierge app instead. Check routing.representable via concierge-router-get first.\n\n⚠ form REJECTED (409) when the router's current webform is a third-party form (not a Chili form) — replacing it would destroy that mapping; check form.representable via concierge-router-get first. branding/localizations are always accepted. A name-only update always succeeds.\n\n⚠ every update publishes the router's current DRAFT — if the draft carries unpublished edits made in the Concierge app, those go live as a side effect, even on a name-only patch\n\n⚠ if the final publish step fails, the changes are saved on an UNPUBLISHED draft and a typed 422 error is returned — fix or delete the draft in the Concierge app\n\nsee: concierge-router-get (check routing.representable / form.representable before replacing), rule-list (find ruleIds), distribution-list (find distributionIds), user-find (find userIds), meeting-type-list (find meetingTypeIds)"
      operationId: conciergeRouterUpdate
      parameters:
      - name: routerId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConciergeRouterUpdate'
        required: true
      responses:
        '200':
          description: ''
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConciergeRouter'
        '400':
          description: 'Invalid value for: path parameter routerId, Invalid value for: body'
          content:
            text/plain:
              schema:
                type: string
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - concierge.modify
    delete:
      tags:
      - concierge
      summary: Remove concierge router
      description: '[operation: concierge-router-delete]




        MUTATING — DESTRUCTIVE




        Deletes a Concierge router by id.


        - routerId (req): the router''s id (path)


        ⚠ irreversible via API; any embeds or links pointing at this router stop working


        see: concierge-list-routers or concierge-router-get (confirm the id before deleting)'
      operationId: conciergeRouterDelete
      parameters:
      - name: routerId
        in: path
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: ''
          headers:
            Cache-Control:
              required: true
              schema:
                type: string
            X-Robots-Tag:
              required: true
              schema:
                type: string
            Pragma:
              required: true
              schema:
                type: string
            Expires:
              required: true
              schema:
                type: string
        '400':
          description: 'Invalid value for: path parameter routerId'
          content:
            text/plain:
              schema:
                type: string
        default:
          description: ''
          headers:
            Location:
              required: false
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                required:
                - errorCode
                - errorMessage
                properties:
                  errorCode:
                    type: string
                  errorMessage:
                    type: string
                  arguments:
                    $ref: '#/components/schemas/Map_String'
      security:
      - apiKeyAuth: []
      X-Chili-Required-Permissions:
      - concierge.remove
components:
  schemas:
    CreateLead:
      title: CreateLead
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: CreateLead
    ProcessedInAppButtonMapping:
      title: ProcessedInAppButtonMapping
      type: object
      required:
      - dataField
      properties:
        dataField:
          $ref: '#/components/schemas/DataFieldRef'
    InternalDataFieldRef:
      title: InternalDataFieldRef
      type: object
      required:
      - value
      - type
      properties:
        value:
          $ref: '#/components/schemas/InternalDataFieldId'
        type:
          type: string
          const: InternalDataFieldRef
    CallRepSettings:
      title: CallRepSettings
      type: object
      required:
      - meetingTypeIds
      - routeCallTo
      - pickUpTime
      - maximumCallAttempts
      - callSuccess
      - callMissed
      - type
      properties:
        meetingTypeIds:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/MeetingTypeId'
        routeCallTo:
          $ref: '#/components/schemas/Assignment'
        pickUpTime:
          type: string
        maximumCallAttempts:
          type: integer
          format: int32
          exclusiveMinimum: 0
        callSuccess:
          $ref: '#/components/schemas/CallSucceededActions'
        callMissed:
          $ref: '#/components/schemas/CallMissedActions'
        type:
          type: string
          const: CallRepSettings
    DoNothing4:
      title: DoNothing
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: DoNothing
    CrmUpdateLeadOwnership:
      title: CrmUpdateLeadOwnership
      type: object
      required:
      - field
      properties:
        field:
          type: string
          pattern: '[^\s\\/]+'
        assignTo:
          $ref: '#/components/schemas/AssignTo'
    RoutingOutcome_OwnerAssign:
      title: RoutingOutcome_OwnerAssign
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: OwnerAssign
    RoutingOutcome_ContactOptions:
      title: RoutingOutcome_ContactOptions
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: ContactOptions
    DoNothing1:
      title: DoNothing
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: DoNothing
    AlwaysCreateLead:
      title: AlwaysCreateLead
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: AlwaysCreateLead
    HubspotUpsertRecord:
      title: HubspotUpsertRecord
      type: object
      required:
      - settings
      - type
      properties:
        settings:
          $ref: '#/components/schemas/HubspotUpsertRecordSettings'
        type:
          type: string
          const: HubspotUpsertRecord
    NoRedirect:
      title: NoRedirect
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: NoRedirect
    CrmMultiUpdateField:
      title: CrmMultiUpdateField
      type: object
      required:
      - type
      properties:
        contact:
          type: array
          items:
            $ref: '#/components/schemas/CrmUpdateContactField'
        lead:
          type: array
          items:
            $ref: '#/components/schemas/CrmUpdateLeadField'
        type:
          type: string
          const: CrmMultiUpdateField
    HubspotUpdateContactField:
      title: HubspotUpdateContactField
      type: object
      required:
      - object
      - field
      - value
      properties:
        object:
          $ref: '#/components/schemas/HubspotUpdateContactFieldTarget'
        field:
          type: string
          pattern: '[^\s\\/]+'
        value:
          $ref: '#/components/schemas/UpdateFieldValue'
    CreateContactIfCompanyExists:
      title: CreateContactIfCompanyExists
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: CreateContactIfCompanyExists
    BookerNotInvited:
      title: BookerNotInvited
      deprecated: true
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: BookerNotInvited
    GenericSalesforceId:
      title: GenericSalesforceId
      type: string
      pattern: ^[a-zA-Z0-9]{18}
    ConciergeFormMappingProcessed:
      title: ConciergeFormMappingProcessed
      oneOf:
      - $ref: '#/components/schemas/ConciergeFormMappingProcessedV1'
      - $ref: '#/components/schemas/ProcessedTriggers'
      discriminator:
        propertyName: type
        mapping:
          ConciergeFormMappingProcessedV1: '#/components/schemas/ConciergeFormMappingProcessedV1'
          ProcessedTriggers: '#/components/schemas/ProcessedTriggers'
    Case:
      title: Case
      type: object
      required:
      - type
      properties:
        type:
          type: string
          const: Case
    HubspotNoMatchBehaviour:
      title: HubspotNoMatchBehaviour
      oneOf:
      - $ref: '#/components/schemas/CreateContact'
      - $ref: '#/components/schemas/CreateContactIfCompanyExists'
      - $ref: '#/components/schemas/DoNothing4'
      discriminator:
        propertyName: type
        mapping:
          CreateContact: '#/components/schemas/CreateContact'
          CreateContactIfCompanyExists: '#/components/schemas/CreateContactIfCompanyExists'
          DoNothing: '#/components/schemas/DoNothing4'
    CrmUpsertRecord:
      title: CrmUpsertRecord
      type: object
      required:
      - settings
      properties:
        settings:
          $ref: '#/components/schemas/LeadOrContactSettings'
    CrmAddToCampaign:
      title: CrmAddToCampaign
      type: object
      required:
      - campaignId
      - memberStatus
      - type
      properties:
        campaignId:
          $ref: '#/components/schemas/CampaignId'
        memberStatus:
          type: string
          minLength: 1
        type:
          type: string
          const: CrmAddToCampaign
    Url:
      title: Url
      type: object
      required:
      - url
      - type
      properties:
        url:
          type: string
        forwardFormDataAsQueryParams:
          type: boolean
        delayBeforeRedirect:
          type: string
        type:
          type: string
          const: Url
    ConciergeRouterId:
 

# --- truncated at 32 KB (92 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/chili-piper/refs/heads/main/openapi/chili-piper-concierge-api-openapi.yml