openapi: 3.1.2
info:
  title: Jointl REST API and OAuth
  version: 1.0.0
  summary: Supported public HTTP contract for Jointl third-party connections.
  description: HTTP contract for Jointl REST operations, OAuth, and Zapier subscription and action endpoints. Jointl does not provide a public sandbox.
  termsOfService: https://join.tl/legal/terms-of-service
  contact:
    name: Jointl Support
    url: https://join.tl
jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema
servers:
  - url: https://api.join.tl
    description: Jointl production API
tags:
  - name: OAuth
    description: OAuth 2.0 and OpenID Connect endpoints.
  - name: Discovery
    description: OAuth resource and issuer discovery.
  - name: Operations
    description: Permission-filtered read operations.
  - name: Actions
    description: Prepare, human approval, and confirmation.
  - name: Zapier
    description: Endpoints restricted to the approved Jointl Zapier app.
paths:
  /oauth/authorize:
    get:
      tags:
        - OAuth
      operationId: authorizeOAuthClient
      summary: Authorize an approved OAuth client
      description: Starts authorization code flow. PKCE S256 and an exact resource indicator are required.
      security: []
      parameters:
        - name: client_id
          in: query
          required: true
          schema:
            type: string
        - name: redirect_uri
          in: query
          required: true
          schema:
            type: string
            format: uri
        - name: response_type
          in: query
          required: true
          schema:
            type: string
            const: code
        - name: scope
          in: query
          required: true
          schema:
            type: string
        - name: state
          in: query
          required: true
          schema:
            type: string
        - name: code_challenge
          in: query
          required: true
          schema:
            type: string
            minLength: 43
            maxLength: 128
        - name: code_challenge_method
          in: query
          required: true
          schema:
            type: string
            const: S256
        - name: resource
          in: query
          required: true
          schema:
            type: string
            enum:
              - https://api.join.tl/api/v1
              - https://mcp.join.tl
        - name: nonce
          in: query
          required: false
          schema:
            type: string
      responses:
        "302":
          description: Redirect to the Jointl authorization interaction or registered client redirect URI.
          headers:
            Location:
              schema:
                type: string
                format: uri
        "400":
          $ref: "#/components/responses/OAuthError"
  /oauth/token:
    post:
      tags:
        - OAuth
      operationId: exchangeOAuthToken
      summary: Exchange or refresh an OAuth token
      description: Exchanges an authorization code with its PKCE verifier, or rotates a refresh token.
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: "#/components/schemas/OAuthTokenRequest"
      responses:
        "200":
          description: Token issued.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/OAuthTokenResponse"
        "400":
          $ref: "#/components/responses/OAuthError"
        "401":
          $ref: "#/components/responses/OAuthError"
        "429":
          $ref: "#/components/responses/RateLimited"
  /oauth/revoke:
    post:
      tags:
        - OAuth
      operationId: revokeOAuthToken
      summary: Revoke an OAuth token
      security: []
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: "#/components/schemas/OAuthRevocationRequest"
      responses:
        "200":
          description: Revocation request accepted.
        "429":
          $ref: "#/components/responses/RateLimited"
  /oauth/jwks:
    get:
      tags:
        - OAuth
      operationId: getOAuthJwks
      summary: Get JSON Web Key Set
      security: []
      responses:
        "200":
          description: Current signing keys.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Jwks"
  /oauth/userinfo:
    get:
      tags:
        - OAuth
      operationId: getOAuthUserInfo
      summary: Get OpenID Connect UserInfo
      security:
        - JointlOAuth:
            - openid
      responses:
        "200":
          description: Authorized user claims.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserInfo"
        "401":
          $ref: "#/components/responses/Unauthorized"
  /.well-known/oauth-authorization-server/oauth:
    get:
      tags:
        - Discovery
      operationId: getOAuthAuthorizationServerMetadata
      summary: Get OAuth authorization-server metadata
      security: []
      responses:
        "200":
          description: Authorization-server metadata.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuthorizationServerMetadata"
  /.well-known/openid-configuration/oauth:
    get:
      tags:
        - Discovery
      operationId: getOpenIdConfiguration
      summary: Get OpenID Connect discovery metadata
      security: []
      responses:
        "200":
          description: OpenID Provider metadata.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuthorizationServerMetadata"
  /.well-known/oauth-protected-resource/api/v1:
    get:
      tags:
        - Discovery
      operationId: getRestProtectedResourceMetadata
      summary: Get REST protected-resource metadata
      security: []
      responses:
        "200":
          description: Protected-resource metadata.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProtectedResourceMetadata"
  /api/v1/operations:
    get:
      tags:
        - Operations
      operationId: listAvailableOperations
      summary: List available operations
      description: Returns only operations allowed by the credential scope and the member’s current permissions.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      responses:
        "200":
          description: Available operation metadata.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      operations:
                        type: array
                        items:
                          $ref: "#/components/schemas/OperationMetadata"
                    required:
                      - operations
                    additionalProperties: false
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
  /api/v1/operations/{operationId}:
    post:
      tags:
        - Operations
      operationId: executeReadOperationById
      summary: Dispatch a read operation
      description: 'Calls a documented read operation by ID. Send its input object directly or wrapped as `{ "input": ... }`.'
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      parameters:
        - name: operationId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: {}
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
  /api/v1/operations/workspace.get:
    post:
      tags:
        - Operations
      operationId: executeWorkspaceGet
      summary: Get workspace access
      description: |-
        Return the current Jointl workspace and the access granted to the member.

        Use when: Call once at the start of a task that depends on workspace identity, company scope, or permissions; do not use it to discover domain records. Returns: workspace ID, workspace name, member identity, accessible companies, and granted permission keys.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkspaceGetInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/WorkspaceGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  companyScope:
                    mode: all
                  grantedPermissions:
                    - flows.view
                  member:
                    id: member_example_01
                    name: Ada Example
                    roleId: owner
                  name: Example Workspace
                  workspaceId: workspace_example_01
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: workspace.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Call once at the start of a task that depends on workspace identity, company scope, or permissions; do not use it to discover domain records
      x-jointl-side-effects: Read-only.
  /api/v1/operations/workspace.search:
    post:
      tags:
        - Operations
      operationId: executeWorkspaceSearch
      summary: Search Jointl
      description: |-
        Quickly search the connected workspace across authorized people, emails, attributes, companies, tags, job titles, and Flows using the same permissions and relevance ranking as the Jointl UI. An optional source-type filter is applied before ranking. Returns at most 30 top matches and is not an exhaustive list.

        Use when: Use for quick entity lookup from a name, email, attribute, company, tag, job title, or Flow phrase; optionally restrict source types before ranking, and use a domain list or analytics operation for complete cohorts. Returns: ranked matches in `sourceRecords`, suggested next operations in `followUpOperations`, result counts, the applied limit, and `exhaustive: false`.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkspaceSearchInput"
            example:
              query: Ada Example
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/WorkspaceSearchResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  exhaustive: false
                  items:
                    - entityId: applicant_example_01
                      entityType: applicant
                      followUpOperations:
                        - input:
                            applicantId: applicant_example_01
                            includeEvidence: true
                          operationId: checks.get
                      label: Ada Example
                      sourceRecords:
                        - applicantId: applicant_example_01
                          companyName: Example Company
                          entityId: applicant_example_01
                          entityType: applicant
                          label: Applicant
                          primary: Software Engineer
                          route: /checks/applicant_example_01
                          statusLabels:
                            - className: new
                              label: New
                              value: new
                  query: Ada Example
                  resultLimit: 30
                  returnedCount: 1
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: workspace.search
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use for quick entity lookup from a name, email, attribute, company, tag, job title, or Flow phrase; optionally restrict source types before ranking, and use a domain list or analytics operation for complete cohorts
      x-jointl-side-effects: Read-only.
  /api/v1/operations/companies.list:
    post:
      tags:
        - Operations
      operationId: executeCompaniesList
      summary: List companies
      description: |-
        List Jointl companies visible through the member’s current company scope.

        Use when: Use before a scoped Flow, Employee import, or other action needs an exact Jointl company ID. Returns: a cursor-paginated list of company IDs, names, statuses, and creation timestamps.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CompaniesListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/CompaniesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      name: Ada Example
                      status: active
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: companies.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use before a scoped Flow, Employee import, or other action needs an exact Jointl company ID
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.list:
    post:
      tags:
        - Operations
      operationId: executeFlowsList
      summary: List Flows
      description: |-
        List Flows available through the member’s role, sharing, ownership, and company access.

        Use when: Use to browse or filter a Flow cohort; use flows.get for one Flow or flows.blueprint.get only for authoring a revision. Returns: a cursor-paginated list of Flow summaries with activity, company, tags, type, status, and IDs.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      status: active
                      title: Example title
                      type: HIRING_REVIEW
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to browse or filter a Flow cohort; use flows.get for one Flow or flows.blueprint.get only for authoring a revision
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.get:
    post:
      tags:
        - Operations
      operationId: executeFlowsGet
      summary: Get Flow
      description: |-
        Get one visible Flow. Sensitive automation tokens are never returned.

        Use when: Use for the operational details of one Flow; use flows.blueprint.get instead when preparing a draft revision. Returns: the authorized Flow details, related company, job role, tags, sharing members, and automation status summaries.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsGetInput"
            example:
              flowId: flowid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  _id: _id_example_01
                  status: active
                  title: Example title
                  type: HIRING_REVIEW
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use for the operational details of one Flow; use flows.blueprint.get instead when preparing a draft revision
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.capabilities.get:
    post:
      tags:
        - Operations
      operationId: executeFlowsCapabilitiesGet
      summary: Get Flow authoring capabilities
      description: |-
        Read supported Flow types, sections, question types, valid section ordering, current authoring permissions, and protected actions before proposing a Flow.

        Use when: Call before creating or substantially redesigning a Flow so the proposed design uses only supported sections and question types. Returns: supported types and sections, authoring limits, current write access, the authoring protocol, and protected actions.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsCapabilitiesGetInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsCapabilitiesGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  authoringProtocol:
                    - example
                  decisionSupport: {}
                  draftWriteSupport: {}
                  flowTypes:
                    - {}
                  liveAccess: {}
                  protectedActions:
                    - example
                  sections:
                    - {}
                  structuredReferenceQuestionTypes:
                    - {}
                  supportedAuthoredQuestionTypes: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.capabilities.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Call before creating or substantially redesigning a Flow so the proposed design uses only supported sections and question types
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.templates.list:
    post:
      tags:
        - Operations
      operationId: executeFlowsTemplatesList
      summary: List Flow templates
      description: |-
        List visible Private and Public Jointl Library templates in one category, including their questions, so an assistant can reuse workspace content and valid IDs.

        Use when: Use to browse one exact template category or inspect all questions in matching templates; use flows.questions.search for cross-category relevance search. Returns: template IDs and titles with complete question blocks for the returned templates, plus indicators telling the assistant to increase the limit or narrow the query when results were truncated.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsTemplatesListInput"
            example:
              kind: preScreening
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsTemplatesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  catalogScanTruncated: false
                  hasMore: false
                  items:
                    - {}
                  kind: private
                  totalMatchedInScan: 1
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.templates.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to browse one exact template category or inspect all questions in matching templates; use flows.questions.search for cross-category relevance search
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.questions.search:
    post:
      tags:
        - Operations
      operationId: executeFlowsQuestionsSearch
      summary: Search Flow questions
      description: |-
        Search relevant questions across visible pre-screening, assessment, test, reference, exit, and Team Pulse templates without loading entire catalogs into the assistant context.

        Use when: Use first when finding reusable questions for a use case across one or more categories; do not load entire template catalogs just to search. Returns: relevance-ranked question and template IDs, prompts, types, options, matched terms, and search coverage details.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsQuestionsSearchInput"
            example:
              query: Ada Example
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsQuestionsSearchResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  catalogScanTruncated: false
                  hasMore: false
                  items:
                    - {}
                  searchedQuestionCount: 1
                  searchedTemplateCount: 1
                  totalMatchedInScan: 1
                  truncatedKinds:
                    - example
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.questions.search
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use first when finding reusable questions for a use case across one or more categories; do not load entire template catalogs just to search
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.referenceTemplates.list:
    post:
      tags:
        - Operations
      operationId: executeFlowsReferenceTemplatesList
      summary: List manual reference templates for a Flow
      description: |-
        List the exact reference forms configured for manual collection on one visible Flow.

        Use when: Use before requesting a reference so the action receives a valid template ID configured on the selected Check’s Flow. Returns: ordered reference template IDs, titles, icons, and types configured on the Flow.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsReferenceTemplatesListInput"
            example:
              flowId: flowid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsReferenceTemplatesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  items:
                    - {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.referenceTemplates.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use before requesting a reference so the action receives a valid template ID configured on the selected Check’s Flow
      x-jointl-side-effects: Read-only.
  /api/v1/operations/flows.blueprint.get:
    post:
      tags:
        - Operations
      operationId: executeFlowsBlueprintGet
      summary: Get complete Flow blueprint
      description: |-
        Read one visible Flow’s latest editable configuration and expanded question/template design. Sensitive automation tokens and protected automation settings are excluded.

        Use when: Use only before flows.draft.revise so the latest revision token and complete supported design can be preserved. Returns: the editable Flow metadata, expanded design, revision token, and indicators for settings that must be managed separately.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowsBlueprintGetInput"
            example:
              flowId: flowid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/FlowsBlueprintGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  design: {}
                  editableDesign: {}
                  flow: {}
                  revision: 2026-01-15T10:30:00.000Z
                  safety: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: flows.blueprint.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only before flows.draft.revise so the latest revision token and complete supported design can be preserved
      x-jointl-side-effects: Read-only.
  /api/v1/operations/performance.operations.get:
    post:
      tags:
        - Operations
      operationId: executePerformanceOperationsGet
      summary: Get Glow Moments and Team Pulse operations
      description: |-
        Read one visible Performance Flow’s participants, cadence, recent Glow Moments and Team Pulse cycles, and completion state. Shareable participant and scoreboard links are returned only when explicitly requested.

        Use when: Use after flows.get for a Performance Flow when the user needs cycle progress, a cycle ID, or an explicitly requested participant/scoreboard link. Returns: the Performance configuration and recent cycles visible to the member; optional participant and scoreboard links include an explicit sharing warning.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PerformanceOperationsGetInput"
            example:
              flowId: flowid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/PerformanceOperationsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  capabilityWarning: Treat returned URLs as private bearer capabilities and share them only with the intended recipient.
                  flow: {}
                  glowMoments: {}
                  teamPulse: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: performance.operations.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after flows.get for a Performance Flow when the user needs cycle progress, a cycle ID, or an explicitly requested participant/scoreboard link
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.list:
    post:
      tags:
        - Operations
      operationId: executeChecksList
      summary: List Checks
      description: |-
        List Checks visible through the member’s role, sharing, creator, manager, and company permissions.

        Use when: Use to browse or filter Checks and obtain applicant IDs; use checks.analytics for comparisons and checks.get for one person. Returns: a cursor-paginated list of authorized Check summaries, Flow context, statuses, progress, and IDs.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      firstName: Ada
                      flowId: flowid_example_01
                      lastName: Example
                      status: active
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to browse or filter Checks and obtain applicant IDs; use checks.analytics for comparisons and checks.get for one person
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.analytics:
    post:
      tags:
        - Operations
      operationId: executeChecksAnalytics
      summary: Analyze Check evidence
      description: |-
        Return a paginated, evidence-based ranking within each visible Flow, including matching scores, measured high and low evidence, evidence coverage, and verification state. It never recommends an employment decision.

        Use when: Use first for top-candidate, ranking, strengths, weaknesses, or cohort-comparison requests; follow nextOffset until null when the complete filtered cohort is required. Returns: per-Flow factual ranks, scores, evidence summaries, coverage and verification signals, cohort counts, pagination, and guidance for human review.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksAnalyticsInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksAnalyticsResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  evaluatedCandidateCount: 1
                  exactCohort: false
                  flowCohorts:
                    - {}
                  hasMore: false
                  items:
                    - applicantId: applicantid_example_01
                      detailOperation: checks.get
                      evidenceSummary: evidencesummary_example_01
                      matchingScore: 75
                      matchingScorePercent: 75
                      name: Ada Example
                      rankWithinFlow: 1
                      scoredCandidateCount: 75
                  nextOffset: 1
                  offset: 1
                  returnedCandidateCount: 1
                  safety: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.analytics
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use first for top-candidate, ranking, strengths, weaknesses, or cohort-comparison requests; follow nextOffset until null when the complete filtered cohort is required
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.get:
    post:
      tags:
        - Operations
      operationId: executeChecksGet
      summary: Get one Check
      description: |-
        Return the profile, Flow context, recent visible activity, and optional condensed evidence for one authorized Check. Sensitive access tokens are never returned.

        Use when: Use after search, list, or analytics when one Check needs contextual detail; use checks.report only for the full itemized assessment and reference report. Returns: profile metadata and recent activity, evidenceIncluded, and either condensed pre-screening, matching, work and reference evidence or null.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksGetInput"
            example:
              applicantId: applicantid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  evidence: {}
                  evidenceIncluded: false
                  profile: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after search, list, or analytics when one Check needs contextual detail; use checks.report only for the full itemized assessment and reference report
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.report:
    post:
      tags:
        - Operations
      operationId: executeChecksReport
      summary: Get Check report
      description: |-
        Return the authorized full factual Check report, including open-text answers, answered AI follow-ups, Tests, reference narratives and integrity context, employment confirmations, attributes, and scores—but no hiring recommendation.

        Use when: Use after checks.analytics for every candidate relevant to a comparative conclusion, or after checks.get when complete itemized evidence is needed; do not rely on rating and score summaries alone. Returns: the itemized authorized Check report with factual narrative and measured evidence; it never returns a recommendation or reference responses the member cannot access.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksReportInput"
            example:
              applicantId: applicantid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksReportResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  assessment: {}
                  company: {}
                  crossVerifiedAttributeScores:
                    - {}
                  flow: {}
                  flowRequest: {}
                  keyAchievements:
                    - {}
                  matchingScore: 75
                  preScreening: {}
                  references:
                    - {}
                  referencesAvgMetrics:
                    - {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.report
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after checks.analytics for every candidate relevant to a comparative conclusion, or after checks.get when complete itemized evidence is needed; do not rely on rating and score summaries alone
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.verifications.get:
    post:
      tags:
        - Operations
      operationId: executeChecksVerificationsGet
      summary: Get verification results for a Check
      description: |-
        Return the verification types available to the member and their latest results for one authorized Check. Image content is not returned.

        Use when: Use after a verification.completed or verification.failed Zapier event, or to inspect which verification types are available, active, complete, locked, or missing required details. Returns: verification types available through the member’s permissions and workspace plan, the latest run status and findings for each type, and Check eligibility state.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksVerificationsGetInput"
            example:
              applicantId: applicantid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksVerificationsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  applicantId: applicantid_example_01
                  canRunAny: false
                  serviceUnavailable: false
                  verificationEligibility: {}
                  verifications:
                    - {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.verifications.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after a verification.completed or verification.failed Zapier event, or to inspect which verification types are available, active, complete, locked, or missing required details
      x-jointl-side-effects: Read-only.
  /api/v1/operations/checks.publicProfiles.get:
    post:
      tags:
        - Operations
      operationId: executeChecksPublicProfilesGet
      summary: Get public profile results for a Check
      description: |-
        Return the latest public-profile discovery results visible for one authorized Check. Image content is not returned.

        Use when: Use after a public_profiles.completed or public_profiles.failed Zapier event, or to inspect a previously completed public-profile discovery run. Returns: the latest and previous completed discovery states, public profile matches available to the member, graph summary, and availability state.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ChecksPublicProfilesGetInput"
            example:
              applicantId: applicantid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ChecksPublicProfilesGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  entitled: false
                  latestRun: {}
                  previousCompletedRun: {}
                  serviceUnavailable: false
                  subjectRef: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: checks.publicProfiles.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after a public_profiles.completed or public_profiles.failed Zapier event, or to inspect a previously completed public-profile discovery run
      x-jointl-side-effects: Read-only.
  /api/v1/operations/references.list:
    post:
      tags:
        - Operations
      operationId: executeReferencesList
      summary: List reference responses for a Check
      description: |-
        List authorized reference request and completion summaries for one visible Check with stable cursor pagination.

        Use when: Use to retrieve every reference for a Check or find a reference ID before retrieving one complete response. Returns: a cursor-paginated list of reference IDs, referee identity, type, status, and lifecycle times.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReferencesListInput"
            example:
              applicantId: applicantid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ReferencesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - applicantId: applicantid_example_01
                      createdAt: 2026-01-15
                      id: id_example_01
                      status: active
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: references.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to retrieve every reference for a Check or find a reference ID before retrieving one complete response
      x-jointl-side-effects: Read-only.
  /api/v1/operations/references.get:
    post:
      tags:
        - Operations
      operationId: executeReferencesGet
      summary: Get one reference response
      description: |-
        Return one authorized, normalized reference response and its Check-level average metrics.

        Use when: Use after references.list or a reference.completed event when the complete submitted response is needed. Returns: the complete reference response available to the member and average reference metrics.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ReferencesGetInput"
            example:
              referenceId: referenceid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ReferencesGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: references.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after references.list or a reference.completed event when the complete submitted response is needed
      x-jointl-side-effects: Read-only.
  /api/v1/operations/employees.list:
    post:
      tags:
        - Operations
      operationId: executeEmployeesList
      summary: List Employees
      description: |-
        List Employees visible through the member’s role, sharing, manager, creator, and company permissions.

        Use when: Use to browse or filter Employees and obtain Employee IDs; use employees.analytics for performance comparisons and employees.get for one person. Returns: a cursor-paginated list of authorized Employee summaries with company, position, manager, tags, status, and IDs.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmployeesListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EmployeesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      companyId: companyid_example_01
                      fullName: Ada Example
                      positionTitle: Example title
                      status: active
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: employees.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to browse or filter Employees and obtain Employee IDs; use employees.analytics for performance comparisons and employees.get for one person
      x-jointl-side-effects: Read-only.
  /api/v1/operations/employees.analytics:
    post:
      tags:
        - Operations
      operationId: executeEmployeesAnalytics
      summary: Analyze Employee performance evidence
      description: |-
        Return a pageable factual ranking and review signals from Team Pulse and Glow Moments for only the Employees visible to the member. It never recommends an employment decision.

        Use when: Use first for best-performer, needs-attention, strengths, weaknesses, or workforce-comparison requests; follow nextOffset until null for the complete filtered cohort. Returns: factual visible-cohort ranks, performance scores, measured evidence, attention signals, counts, pagination, and guidance for human review.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmployeesAnalyticsInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EmployeesAnalyticsResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  evaluatedEmployeeCount: 1
                  evidenceWindow:
                    endDate: 2026-01-15
                    inclusive: true
                    startDate: 2026-01-15
                    timeZone: UTC
                  exactCohort: false
                  hasMore: false
                  items:
                    - {}
                  nextOffset: 1
                  offset: 1
                  returnedEmployeeCount: 1
                  safety: {}
                  scoredEmployeeCount: 75
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: employees.analytics
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use first for best-performer, needs-attention, strengths, weaknesses, or workforce-comparison requests; follow nextOffset until null for the complete filtered cohort
      x-jointl-side-effects: Read-only.
  /api/v1/operations/employees.get:
    post:
      tags:
        - Operations
      operationId: executeEmployeesGet
      summary: Get one Employee
      description: |-
        Return the profile, current work context, recent visible activity, and optional performance evidence for one authorized Employee.

        Use when: Use after search, list, or analytics when one Employee needs contextual or performance detail; set includeEvidence=false only for lightweight profile metadata. Returns: profile, position, company, manager, tags and compensation-access metadata, plus optional Team Pulse, Glow Moments, exit, and work evidence.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmployeesGetInput"
            example:
              employeeId: employeeid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EmployeesGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  evidence: {}
                  evidenceIncluded: false
                  profile: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: employees.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after search, list, or analytics when one Employee needs contextual or performance detail; set includeEvidence=false only for lightweight profile metadata
      x-jointl-side-effects: Read-only.
  /api/v1/operations/employees.exitIntelligence.get:
    post:
      tags:
        - Operations
      operationId: executeEmployeesExitIntelligenceGet
      summary: Get Exit Intelligence result
      description: |-
        Return the latest or one exact authorized Exit Intelligence request for a visible Employee, including completed answers and calculated metrics. Public access tokens are never returned.

        Use when: Use after an exit_intelligence.completed Zapier event, passing its request ID when available so a later request cannot replace the intended result. Returns: the visible Employee summary and zero or one non-cancelled Exit Intelligence request with its Flow, form, metrics, and answered questions.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EmployeesExitIntelligenceGetInput"
            example:
              employeeId: employeeid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EmployeesExitIntelligenceGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  employee: {}
                  requests:
                    - {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: employees.exitIntelligence.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after an exit_intelligence.completed Zapier event, passing its request ID when available so a later request cannot replace the intended result
      x-jointl-side-effects: Read-only.
  /api/v1/operations/talents.list:
    post:
      tags:
        - Operations
      operationId: executeTalentsList
      summary: List Talent Pool profiles
      description: |-
        List company-scoped Talent Pool profiles. Profiles without an authorized company match are not returned.

        Use when: Use to browse and filter the authorized Talent Pool and obtain profile IDs; use talents.get for one profile. Returns: a cursor-paginated list of scoped Talent Pool summaries, statuses, experience and evidence metrics allowed by the role.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TalentsListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/TalentsListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      firstName: Ada
                      lastName: Example
                      status: active
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: talents.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to browse and filter the authorized Talent Pool and obtain profile IDs; use talents.get for one profile
      x-jointl-side-effects: Read-only.
  /api/v1/operations/talents.get:
    post:
      tags:
        - Operations
      operationId: executeTalentsGet
      summary: Get one Talent Pool profile
      description: |-
        Return the profile and optional evidence overview for one company-scoped Talent Pool person.

        Use when: Use after search or talents.list for one profile; use talents.references.list only when itemized reference responses are specifically needed and permitted. Returns: profile, contact and extracted experience data, plus optional achievements, work, notes, answer signals and cross-verified attributes.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TalentsGetInput"
            example:
              talentId: talentid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/TalentsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  evidence: {}
                  evidenceIncluded: false
                  profile: {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: talents.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after search or talents.list for one profile; use talents.references.list only when itemized reference responses are specifically needed and permitted
      x-jointl-side-effects: Read-only.
  /api/v1/operations/talents.references.list:
    post:
      tags:
        - Operations
      operationId: executeTalentsReferencesList
      summary: List Talent Pool reference responses
      description: |-
        Return reference responses only when both Talent Pool and response permissions allow it.

        Use when: Use only for itemized authorized reference responses on one Talent Pool profile; talents.get is the normal profile and evidence path. Returns: normalized reference responses and average reference metrics, with third-party identities masked when required.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TalentsReferencesListInput"
            example:
              talentId: talentid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/TalentsReferencesListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  avgMetrics:
                    - {}
                  references:
                    - {}
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: talents.references.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only for itemized authorized reference responses on one Talent Pool profile; talents.get is the normal profile and evidence path
      x-jointl-side-effects: Read-only.
  /api/v1/operations/autopilots.list:
    post:
      tags:
        - Operations
      operationId: executeAutopilotsList
      summary: List Autopilots
      description: |-
        List Autopilot groups available through the member’s current permissions and Flow or company access. Shareable access links are omitted from list results.

        Use when: Use to find an Autopilot group, inspect status and Check counts, or obtain a group ID; use autopilots.get only when its public links are needed. Returns: a cursor-paginated list of visible Autopilot summaries without shareable access links.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AutopilotsListInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/AutopilotsListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  hasMore: false
                  items:
                    - _id: _id_example_01
                      checksTotal: 1
                      flowId: flowid_example_01
                      status: active
                      title: Example title
                  nextCursor: null
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: autopilots.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use to find an Autopilot group, inspect status and Check counts, or obtain a group ID; use autopilots.get only when its public links are needed
      x-jointl-side-effects: Read-only.
  /api/v1/operations/autopilots.get:
    post:
      tags:
        - Operations
      operationId: executeAutopilotsGet
      summary: Get Autopilot and public links
      description: |-
        Return one visible Autopilot and its reusable public access links. Anyone holding an active link can start the attached Flow.

        Use when: Use only when the user needs to inspect one known Autopilot or retrieve its links for an intended audience; do not expose links from a broad list. Returns: Autopilot status, Flow context, Check count, enabled sections, public links, and a sharing warning.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AutopilotsGetInput"
            example:
              autopilotGroupId: autopilotgroupid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/AutopilotsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  autopilotGroupId: autopilotgroupid_example_01
                  capabilityWarning: Treat returned URLs as private bearer capabilities and share them only with the intended recipient.
                  checksTotal: 1
                  createdAt: 2026-01-15
                  flowId: flowid_example_01
                  publicLinks:
                    - example
                  status: active
                  title: Example title
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: autopilots.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user needs to inspect one known Autopilot or retrieve its links for an intended audience; do not expose links from a broad list
      x-jointl-side-effects: Read-only.
  /api/v1/operations/insights.get:
    post:
      tags:
        - Operations
      operationId: executeInsightsGet
      summary: Get Jointl Insights
      description: |-
        Return the General, Performance, or Exit Intelligence view available to the member for an inclusive UTC date range, using the same calculations shown in Jointl.

        Use when: Use for workspace activity and completion metrics, team performance evidence, or Exit Intelligence themes; select one view and supply both dates when the user specifies a period. Returns: the selected Insights dataset plus the applied view, inclusive UTC dates, and company, Flow, and role filters.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/InsightsGetInput"
            example: {}
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/InsightsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  data:
                    summary:
                      activeChecks: 12
                      activeEmployees: 34
                  dateRange:
                    endDate: 2026-01-15
                    inclusive: true
                    startDate: 2025-07-15
                    timeZone: UTC
                  filters:
                    companyIds: []
                    flowIds: []
                    roleTitles: []
                  view: general
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: insights.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use for workspace activity and completion metrics, team performance evidence, or Exit Intelligence themes; select one view and supply both dates when the user specifies a period
      x-jointl-side-effects: Read-only.
  /api/v1/operations/events.list:
    post:
      tags:
        - Operations
      operationId: executeEventsList
      summary: List recent Zapier events
      description: |-
        Return up to three recent events that the connected member can access, matching one Zapier trigger and its filters.

        Use when: Use when Zapier tests or configures a trigger before new events are available. Returns: newest-first trigger payloads with the same shape returned after a Zapier webhook notification.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EventsListInput"
            example:
              eventType: check.created
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EventsListResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  items:
                    - check_id: check_example_01
                      company_ids:
                        - company_example_01
                      data:
                        id: check_example_01
                        status: new
                      entity_id: check_example_01
                      entity_type: check
                      event_type: check.created
                      id: event_example_01
                      jointl_url: https://join.tl/checks/check_example_01
                      occurred_at: 2026-01-15T10:30:00.000Z
                      record_name: Ada Example
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: events.list
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use when Zapier tests or configures a trigger before new events are available
      x-jointl-side-effects: Read-only.
  /api/v1/operations/events.get:
    post:
      tags:
        - Operations
      operationId: executeEventsGet
      summary: Get one Zapier event
      description: |-
        Retrieve the full payload for one opaque event notification through the member’s current Jointl permissions.

        Use when: Use only after an instant Zapier hook receives an event ID. Returns: one authorized trigger payload; revoked or inaccessible records are not returned.
      security:
        - JointlOAuth:
            - workspace.read
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EventsGetInput"
            example:
              eventId: eventid_example_01
      responses:
        "200":
          description: Operation completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/EventsGetResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
              example:
                data:
                  check_id: check_example_01
                  company_ids:
                    - company_example_01
                  data:
                    id: check_example_01
                    status: new
                  entity_id: check_example_01
                  entity_type: check
                  event_type: check.created
                  id: event_example_01
                  jointl_url: https://join.tl/checks/check_example_01
                  occurred_at: 2026-01-15T10:30:00.000Z
                  record_name: Ada Example
                requestId: request_example_01
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-logical-operation: events.get
      x-jointl-scope: workspace.read
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: false
      x-jointl-destructive: false
      x-jointl-retry-safety: safe-read
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only after an instant Zapier hook receives an event ID
      x-jointl-side-effects: Read-only.
  /api/v1/actions/prepare:
    post:
      tags:
        - Actions
      operationId: prepareAction
      summary: Prepare a protected write
      description: Creates a five-minute preview and confirmation token without modifying Jointl data.
      security:
        - JointlOAuth:
            - workspace.write
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActionPrepareRequest"
            example:
              idempotencyKey: intent.example.0001
              input:
                flowId: flowid_example_01
              operationId: glowMoments.send
      responses:
        "200":
          description: Action prepared or a completed replay returned.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ActionPrepareResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-human-approval-required: true
  /api/v1/actions/confirm:
    post:
      tags:
        - Actions
      operationId: confirmAction
      summary: Confirm an approved prepared action
      description: Executes exactly the prepared input after explicit human approval and a current permission and record-state check.
      security:
        - JointlOAuth:
            - workspace.write
        - JointlApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ActionConfirmRequest"
            example:
              confirmationToken: jtl_confirm_23456789ABCDEFGHJ.example_confirmation_token_000000000000
      responses:
        "200":
          description: Action completed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ActionConfirmResult"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
      x-jointl-human-approval-required: true
  /api/v1/actions/execute:
    post:
      tags:
        - Zapier
      operationId: executeStandingZapierAction
      summary: Execute an approved Zapier action
      description: Execution available only to the installed Zapier app for approved, non-destructive, idempotent operations.
      security:
        - JointlOAuth:
            - workspace.write
      parameters:
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            $ref: "#/components/schemas/IdempotencyKey"
          description: Derived by the Jointl Zapier app from Source Event ID and action identity.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/StandingActionExecuteRequest"
            example:
              operationId: checks.verifications.runAll
              input:
                applicantId: applicantid_example_01
      responses:
        "200":
          description: Zapier action completed or returned from a previous identical request.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: {}
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
  /api/v1/webhook-subscriptions:
    post:
      tags:
        - Zapier
      operationId: createZapierWebhookSubscription
      summary: Create or renew a Zapier webhook subscription
      description: Creates a 21-day Zapier-owned subscription. Target origins are allowlisted by Jointl.
      security:
        - JointlOAuth:
            - workspace.read
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WebhookSubscriptionRequest"
            example:
              eventType: check.created
              filters:
                flowId: flow_example_01
              targetUrl: https://hooks.zapier.com/hooks/catch/example/example
      responses:
        "201":
          description: Subscription created or renewed.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/WebhookSubscription"
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
  /api/v1/webhook-subscriptions/{id}:
    delete:
      tags:
        - Zapier
      operationId: deleteZapierWebhookSubscription
      summary: Disable a Zapier webhook subscription
      security:
        - JointlOAuth:
            - workspace.read
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Subscription disabled.
          headers:
            X-Request-Id:
              $ref: "#/components/headers/RequestId"
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                      disabled:
                        type: boolean
                    required:
                      - id
                      - disabled
                  requestId:
                    type: string
                    description: Request correlation identifier.
                required:
                  - data
                  - requestId
                additionalProperties: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "409":
          $ref: "#/components/responses/Conflict"
        "413":
          $ref: "#/components/responses/TooLarge"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          $ref: "#/components/responses/ServerError"
        "503":
          $ref: "#/components/responses/Unavailable"
components:
  securitySchemes:
    JointlOAuth:
      type: oauth2
      description: OAuth access token issued for the REST resource.
      flows:
        authorizationCode:
          authorizationUrl: https://api.join.tl/oauth/authorize
          tokenUrl: https://api.join.tl/oauth/token
          refreshUrl: https://api.join.tl/oauth/token
          scopes:
            openid: Authenticate the Jointl member.
            email: Read the authorized member email claim.
            workspace.read: Read authorized Jointl workspace data.
            workspace.write: Prepare and confirm authorized Jointl changes.
            offline_access: Receive a rotating refresh token.
      x-jointl-resource: https://api.join.tl/api/v1
      x-jointl-pkce-required: S256
    JointlApiKey:
      type: http
      scheme: bearer
      bearerFormat: Jointl personal or service-account API key
      description: Server-side personal or service credential. Never embed in browser or hosted AI clients.
  headers:
    RequestId:
      description: Request correlation identifier.
      schema:
        type: string
    RetryAfter:
      description: Seconds before retrying.
      schema:
        type: integer
        minimum: 1
  schemas:
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
          required:
            - code
            - message
          additionalProperties: false
        requestId:
          type: string
      required:
        - error
        - requestId
      additionalProperties: false
    IdempotencyKey:
      type: string
      minLength: 8
      maxLength: 160
      pattern: ^[A-Za-z0-9._:-]{8,160}$
      description: Stable identity for one logical intent. Reuse only for identical input.
    ActionPrepareRequest:
      oneOf:
        - $ref: "#/components/schemas/GlowMomentsSendPrepareRequest"
        - $ref: "#/components/schemas/GlowMomentsCycleStatusSetPrepareRequest"
        - $ref: "#/components/schemas/TeamPulseSendPrepareRequest"
        - $ref: "#/components/schemas/TeamPulseCycleStatusSetPrepareRequest"
        - $ref: "#/components/schemas/ChecksVerificationsRunAllPrepareRequest"
        - $ref: "#/components/schemas/ChecksPublicProfilesFindPrepareRequest"
        - $ref: "#/components/schemas/FlowsDraftCreatePrepareRequest"
        - $ref: "#/components/schemas/FlowsDraftRevisePrepareRequest"
        - $ref: "#/components/schemas/FlowsStatusSetPrepareRequest"
        - $ref: "#/components/schemas/FlowsDeletePrepareRequest"
        - $ref: "#/components/schemas/ChecksStatusSetPrepareRequest"
        - $ref: "#/components/schemas/ChecksDeletePrepareRequest"
        - $ref: "#/components/schemas/EmployeesStatusSetPrepareRequest"
        - $ref: "#/components/schemas/EmployeesDeletePrepareRequest"
        - $ref: "#/components/schemas/TalentsStatusSetPrepareRequest"
        - $ref: "#/components/schemas/AutopilotsCreatePrepareRequest"
        - $ref: "#/components/schemas/AutopilotsLinksGeneratePrepareRequest"
        - $ref: "#/components/schemas/AutopilotsStatusSetPrepareRequest"
        - $ref: "#/components/schemas/AutopilotsDeletePrepareRequest"
        - $ref: "#/components/schemas/ReferencesRequestPrepareRequest"
        - $ref: "#/components/schemas/ChecksBulkCreatePrepareRequest"
        - $ref: "#/components/schemas/EmployeesBulkImportPrepareRequest"
        - $ref: "#/components/schemas/ChecksAddNotePrepareRequest"
        - $ref: "#/components/schemas/EmployeesAddNotePrepareRequest"
        - $ref: "#/components/schemas/TalentsAddNotePrepareRequest"
      discriminator:
        propertyName: operationId
    StandingActionExecuteRequest:
      oneOf:
        - $ref: "#/components/schemas/ChecksVerificationsRunAllExecuteRequest"
        - $ref: "#/components/schemas/ChecksPublicProfilesFindExecuteRequest"
        - $ref: "#/components/schemas/ChecksStatusSetExecuteRequest"
        - $ref: "#/components/schemas/EmployeesStatusSetExecuteRequest"
        - $ref: "#/components/schemas/TalentsStatusSetExecuteRequest"
        - $ref: "#/components/schemas/ReferencesRequestExecuteRequest"
        - $ref: "#/components/schemas/ChecksBulkCreateExecuteRequest"
        - $ref: "#/components/schemas/EmployeesBulkImportExecuteRequest"
        - $ref: "#/components/schemas/ChecksAddNoteExecuteRequest"
        - $ref: "#/components/schemas/EmployeesAddNoteExecuteRequest"
        - $ref: "#/components/schemas/TalentsAddNoteExecuteRequest"
      discriminator:
        propertyName: operationId
    ActionConfirmRequest:
      type: object
      properties:
        confirmationToken:
          type: string
          minLength: 40
          maxLength: 256
      required:
        - confirmationToken
      additionalProperties: false
    ActionPrepareResult:
      oneOf:
        - additionalProperties: true
          properties:
            confirmationId:
              type: string
            confirmationToken:
              type: string
            expiresAt:
              type: string
            instruction:
              type: string
            operation:
              additionalProperties: true
              properties:
                id:
                  type: string
                title:
                  type: string
              required:
                - id
                - title
              type: object
            preview:
              additionalProperties: true
              type: object
            state:
              const: pending
          required:
            - confirmationId
            - state
            - confirmationToken
            - expiresAt
            - operation
            - preview
            - instruction
          type: object
        - additionalProperties: true
          properties:
            confirmationId:
              type: string
            result: {}
            state:
              const: completed
          required:
            - confirmationId
            - state
            - result
          type: object
    ActionConfirmResult:
      allOf:
        - additionalProperties: true
          properties:
            confirmationId:
              type: string
            result: {}
            state:
              const: completed
          required:
            - confirmationId
            - state
            - result
          type: object
        - type: object
          properties:
            result:
              oneOf:
                - $ref: "#/components/schemas/GlowMomentsSendResult"
                - $ref: "#/components/schemas/GlowMomentsCycleStatusSetResult"
                - $ref: "#/components/schemas/TeamPulseSendResult"
                - $ref: "#/components/schemas/TeamPulseCycleStatusSetResult"
                - $ref: "#/components/schemas/ChecksVerificationsRunAllResult"
                - $ref: "#/components/schemas/ChecksPublicProfilesFindResult"
                - $ref: "#/components/schemas/FlowsDraftCreateResult"
                - $ref: "#/components/schemas/FlowsDraftReviseResult"
                - $ref: "#/components/schemas/FlowsStatusSetResult"
                - $ref: "#/components/schemas/FlowsDeleteResult"
                - $ref: "#/components/schemas/ChecksStatusSetResult"
                - $ref: "#/components/schemas/ChecksDeleteResult"
                - $ref: "#/components/schemas/EmployeesStatusSetResult"
                - $ref: "#/components/schemas/EmployeesDeleteResult"
                - $ref: "#/components/schemas/TalentsStatusSetResult"
                - $ref: "#/components/schemas/AutopilotsCreateResult"
                - $ref: "#/components/schemas/AutopilotsLinksGenerateResult"
                - $ref: "#/components/schemas/AutopilotsStatusSetResult"
                - $ref: "#/components/schemas/AutopilotsDeleteResult"
                - $ref: "#/components/schemas/ReferencesRequestResult"
                - $ref: "#/components/schemas/ChecksBulkCreateResult"
                - $ref: "#/components/schemas/EmployeesBulkImportResult"
                - $ref: "#/components/schemas/ChecksAddNoteResult"
                - $ref: "#/components/schemas/EmployeesAddNoteResult"
                - $ref: "#/components/schemas/TalentsAddNoteResult"
    OAuthTokenRequest:
      oneOf:
        - type: object
          properties:
            grant_type:
              type: string
              const: authorization_code
            code:
              type: string
            redirect_uri:
              type: string
              format: uri
            client_id:
              type: string
            code_verifier:
              type: string
              minLength: 43
              maxLength: 128
            resource:
              type: string
              format: uri
          required:
            - grant_type
            - code
            - redirect_uri
            - client_id
            - code_verifier
            - resource
        - type: object
          properties:
            grant_type:
              type: string
              const: refresh_token
            refresh_token:
              type: string
            client_id:
              type: string
            scope:
              type: string
            resource:
              type: string
              format: uri
          required:
            - grant_type
            - refresh_token
            - client_id
    OAuthTokenResponse:
      type: object
      properties:
        access_token:
          type: string
        token_type:
          type: string
          const: Bearer
        expires_in:
          type: integer
        refresh_token:
          type: string
        scope:
          type: string
        id_token:
          type: string
      required:
        - access_token
        - token_type
        - expires_in
        - scope
    OAuthRevocationRequest:
      type: object
      properties:
        token:
          type: string
        token_type_hint:
          type: string
          enum:
            - access_token
            - refresh_token
        client_id:
          type: string
      required:
        - token
    Jwks:
      type: object
      properties:
        keys:
          type: array
          items:
            type: object
            additionalProperties: true
      required:
        - keys
    UserInfo:
      type: object
      properties:
        sub:
          type: string
        email:
          type: string
          format: email
        email_verified:
          type: boolean
        name:
          type: string
      required:
        - sub
      additionalProperties: true
    AuthorizationServerMetadata:
      type: object
      properties:
        issuer:
          type: string
          const: https://api.join.tl/oauth
        authorization_endpoint:
          type: string
          format: uri
        token_endpoint:
          type: string
          format: uri
        revocation_endpoint:
          type: string
          format: uri
        jwks_uri:
          type: string
          format: uri
        userinfo_endpoint:
          type: string
          format: uri
        scopes_supported:
          type: array
          items:
            type: string
        response_types_supported:
          type: array
          items:
            type: string
        code_challenge_methods_supported:
          type: array
          items:
            type: string
            const: S256
      required:
        - issuer
        - authorization_endpoint
        - token_endpoint
        - jwks_uri
      additionalProperties: true
    ProtectedResourceMetadata:
      type: object
      properties:
        resource:
          type: string
          const: https://api.join.tl/api/v1
        resource_name:
          type: string
          const: Jointl API
        authorization_servers:
          type: array
          items:
            type: string
        bearer_methods_supported:
          type: array
          items:
            type: string
        scopes_supported:
          type: array
          items:
            type: string
      required:
        - resource
        - resource_name
        - authorization_servers
        - bearer_methods_supported
        - scopes_supported
    OperationMetadata:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        description:
          type: string
        whenToUse:
          type: string
        returns:
          type: string
        scope:
          type: string
          enum:
            - workspace.read
            - workspace.write
        confirmationRequired:
          type: boolean
        destructive:
          type: boolean
        retrySafety:
          type: string
          enum:
            - idempotent
            - at-most-once
        standingAutomation:
          type: boolean
        inputSchema:
          type: object
          additionalProperties: true
        outputSchema:
          type: object
          additionalProperties: true
      required:
        - id
        - title
        - description
        - whenToUse
        - returns
        - scope
        - confirmationRequired
        - destructive
        - inputSchema
        - outputSchema
    WebhookSubscriptionRequest:
      type: object
      properties:
        eventType:
          type: string
          enum:
            - check.created
            - check.status_changed
            - check.completed
            - verification.completed
            - verification.failed
            - public_profiles.completed
            - public_profiles.failed
            - reference.completed
            - employee.created
            - employee.updated
            - employee.status_changed
            - exit_intelligence.requested
            - exit_intelligence.completed
            - talent.created
            - talent.updated
            - talent.status_changed
        filters:
          type: object
          properties:
            companyId:
              type: string
            flowId:
              type: string
          additionalProperties: false
        targetUrl:
          type: string
          format: uri
      required:
        - eventType
        - targetUrl
      additionalProperties: false
    WebhookSubscription:
      type: object
      properties:
        id:
          type: string
        eventType:
          type: string
        filters:
          type: object
          additionalProperties: false
        createdAt:
          type: string
          format: date-time
        expiration_date:
          type: string
          format: date-time
      required:
        - id
        - eventType
        - filters
        - createdAt
        - expiration_date
    WorkspaceGetInput:
      additionalProperties: false
      properties: {}
      type: object
    WorkspaceGetResult:
      additionalProperties: true
      properties:
        companyScope:
          additionalProperties: true
          type: object
        grantedPermissions:
          items:
            type: string
          type: array
        member:
          additionalProperties: true
          properties:
            id:
              type:
                - string
                - "null"
            name:
              type:
                - string
                - "null"
            roleId:
              type:
                - string
                - "null"
          type: object
        name:
          type: string
        workspaceId:
          type: string
      required:
        - workspaceId
        - name
        - member
        - companyScope
        - grantedPermissions
      type: object
    WorkspaceSearchInput:
      additionalProperties: false
      properties:
        entityTypes:
          description: Optional source-type filter applied before ranking. Omit it to search every global-search type.
          items:
            enum:
              - applicant
              - employee
              - talent
              - reference
              - flow
              - member
            type: string
          maxItems: 6
          minItems: 1
          type: array
        limit:
          default: 30
          maximum: 30
          minimum: 1
          type: integer
        query:
          description: Search people, emails, attributes, companies, tags, job titles, and Flows.
          maxLength: 120
          minLength: 2
          type: string
      required:
        - query
      type: object
    WorkspaceSearchResult:
      additionalProperties: true
      properties:
        exhaustive:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              entityId:
                type:
                  - string
                  - "null"
              entityType:
                type: string
              followUpOperations:
                items:
                  additionalProperties: true
                  properties:
                    input:
                      additionalProperties: true
                      type: object
                    operationId:
                      type: string
                  required:
                    - operationId
                    - input
                  type: object
                type: array
              label:
                type: string
              sourceRecords:
                items:
                  additionalProperties: true
                  properties:
                    applicantId:
                      type:
                        - string
                        - "null"
                    companyName:
                      type:
                        - string
                        - "null"
                    entityId:
                      type: string
                    entityType:
                      type: string
                    label:
                      type: string
                    primary:
                      type:
                        - string
                        - "null"
                    route:
                      type:
                        - string
                        - "null"
                    statusLabels:
                      items:
                        additionalProperties: true
                        type: object
                      type: array
                  required:
                    - entityType
                    - entityId
                  type: object
                type: array
            type: object
          type: array
        query:
          type: string
        resultLimit:
          type: number
        returnedCount:
          type: number
      required:
        - query
        - items
        - returnedCount
        - resultLimit
        - exhaustive
      type: object
    CompaniesListInput:
      additionalProperties: false
      properties:
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - id
          type: object
        includeArchived:
          default: false
          description: Include archived companies; active companies are returned by default.
          type: boolean
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
      type: object
    CompaniesListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              name:
                type: string
              status:
                type:
                  - string
                  - "null"
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    FlowsListInput:
      additionalProperties: false
      properties:
        activeOnly:
          default: false
          description: Return only active Flows when true.
          type: boolean
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - id
          type: object
        includeActivity:
          default: true
          description: Include aggregate activity counts. Disable for lightweight selectors and dropdowns.
          type: boolean
        includeUnscopedCompanies:
          default: false
          description: When company filters are supplied, also include authorized Flows with no company.
          type: boolean
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
        selectedCompanies:
          default: []
          description: Exact Jointl company IDs from companies.list; empty means every authorized company.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        selectedFlowStatus:
          default: []
          description: Exact Flow statuses; empty means every authorized status.
          items:
            enum:
              - ACTIVE
              - DRAFT
              - ARCHIVED
            type: string
          maxItems: 100
          type: array
        selectedTags:
          default: []
          description: Exact Jointl tag IDs; empty means every tag.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        type:
          description: Optionally return one exact enabled Flow type.
          enum:
            - HIRING_REVIEW
            - PERFORMANCE
            - EXIT_INTELLIGENCE
          type: string
      type: object
    FlowsListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              status:
                type:
                  - string
                  - "null"
              title:
                type: string
              type:
                type:
                  - string
                  - "null"
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    FlowsGetInput:
      additionalProperties: false
      properties:
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
      type: object
    FlowsGetResult:
      additionalProperties: true
      properties:
        _id:
          type: string
        status:
          type:
            - string
            - "null"
        title:
          type: string
        type:
          type:
            - string
            - "null"
      type: object
    FlowsCapabilitiesGetInput:
      additionalProperties: false
      properties: {}
      type: object
    FlowsCapabilitiesGetResult:
      additionalProperties: true
      properties:
        authoringProtocol:
          items:
            type: string
          type: array
        decisionSupport:
          additionalProperties: true
          type: object
        draftWriteSupport:
          additionalProperties: true
          type: object
        flowTypes:
          items:
            additionalProperties: true
            type: object
          type: array
        liveAccess:
          additionalProperties: true
          type: object
        protectedActions:
          items:
            type: string
          type: array
        sections:
          items:
            additionalProperties: true
            type: object
          type: array
        structuredReferenceQuestionTypes:
          items:
            additionalProperties: true
            type: object
          type: array
        supportedAuthoredQuestionTypes:
          additionalProperties: true
          type: object
      required:
        - flowTypes
        - sections
        - supportedAuthoredQuestionTypes
        - structuredReferenceQuestionTypes
        - draftWriteSupport
        - liveAccess
        - decisionSupport
        - authoringProtocol
        - protectedActions
      type: object
    FlowsTemplatesListInput:
      additionalProperties: false
      properties:
        kind:
          description: One exact template category to browse.
          enum:
            - preScreening
            - assessmentQuestions
            - assessmentTests
            - references
            - exitIntelligence
            - teamPulse
          type: string
        limit:
          default: 50
          maximum: 100
          minimum: 1
          type: integer
        query:
          maxLength: 120
          minLength: 1
          type: string
      required:
        - kind
      type: object
    FlowsTemplatesListResult:
      additionalProperties: true
      properties:
        catalogScanTruncated:
          type: boolean
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            type: object
          type: array
        kind:
          type: string
        totalMatchedInScan:
          type: number
      required:
        - kind
        - items
        - totalMatchedInScan
        - catalogScanTruncated
        - hasMore
      type: object
    FlowsQuestionsSearchInput:
      additionalProperties: false
      properties:
        kinds:
          default:
            - preScreening
            - assessmentQuestions
            - assessmentTests
            - references
            - exitIntelligence
            - teamPulse
          description: Categories to search. Restrict this list when the requested Flow uses only specific sections.
          items:
            enum:
              - preScreening
              - assessmentQuestions
              - assessmentTests
              - references
              - exitIntelligence
              - teamPulse
            type: string
          maxItems: 6
          type: array
        limit:
          default: 25
          maximum: 100
          minimum: 1
          type: integer
        query:
          description: The job-related capability or use case to find in question prompts, attributes, template titles, types, and options.
          maxLength: 160
          minLength: 2
          type: string
      required:
        - query
      type: object
    FlowsQuestionsSearchResult:
      additionalProperties: true
      properties:
        catalogScanTruncated:
          type: boolean
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              aiFollowUpEnabled:
                type: boolean
              attribute:
                type:
                  - string
                  - "null"
              insightsExtractionEnabled:
                type: boolean
              kind:
                type: string
              matchedTerms:
                items:
                  type: string
                type: array
              prompt:
                type:
                  - string
                  - "null"
              questionId:
                type:
                  - string
                  - "null"
              relevance:
                type: number
              templateId:
                type: string
              templateSource:
                type: string
              templateTitle:
                type: string
              type:
                type:
                  - string
                  - "null"
            type: object
          type: array
        searchedQuestionCount:
          type: number
        searchedTemplateCount:
          type: number
        totalMatchedInScan:
          type: number
        truncatedKinds:
          items:
            type: string
          type: array
      required:
        - items
        - totalMatchedInScan
        - searchedTemplateCount
        - searchedQuestionCount
        - catalogScanTruncated
        - truncatedKinds
        - hasMore
      type: object
    FlowsReferenceTemplatesListInput:
      additionalProperties: false
      properties:
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
      type: object
    FlowsReferenceTemplatesListResult:
      additionalProperties: true
      properties:
        items:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - items
      type: object
    FlowsBlueprintGetInput:
      additionalProperties: false
      properties:
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
      type: object
    FlowsBlueprintGetResult:
      additionalProperties: true
      properties:
        design:
          additionalProperties: true
          type: object
        editableDesign:
          additionalProperties: true
          type: object
        flow:
          additionalProperties: true
          type: object
        revision:
          type: string
        safety:
          additionalProperties: true
          type: object
      required:
        - flow
        - design
        - editableDesign
        - revision
        - safety
      type: object
    PerformanceOperationsGetInput:
      additionalProperties: false
      properties:
        cycleLimit:
          default: 5
          description: Number of recent Glow Moments and Team Pulse cycles to return per feature.
          maximum: 10
          minimum: 1
          type: integer
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        includeLinks:
          default: false
          description: Include participant access links and the Glow scoreboard link only when the user explicitly needs them.
          type: boolean
      required:
        - flowId
      type: object
    PerformanceOperationsGetResult:
      additionalProperties: true
      properties:
        capabilityWarning:
          type:
            - string
            - "null"
        flow:
          additionalProperties: true
          type: object
        glowMoments:
          additionalProperties: true
          type: object
        teamPulse:
          additionalProperties: true
          type: object
      required:
        - flow
        - glowMoments
        - teamPulse
      type: object
    GlowMomentsSendInput:
      additionalProperties: false
      properties:
        expectedFlowStatus:
          const: ACTIVE
          default: ACTIVE
          description: The Flow must still be ACTIVE when the confirmed send executes.
          type: string
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
      type: object
    GlowMomentsSendResult:
      additionalProperties: true
      properties:
        flowId:
          type: string
        queued:
          type: boolean
        scheduledFor:
          type: string
      required:
        - flowId
        - queued
        - scheduledFor
      type: object
    GlowMomentsSendPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: glowMoments.send
        input:
          $ref: "#/components/schemas/GlowMomentsSendInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: glowMoments.send
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to send Glow Moments now; publishing alone follows the configured cadence and is not a manual-send request
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    GlowMomentsCycleStatusSetInput:
      additionalProperties: false
      properties:
        cycleId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        enabled:
          description: False cancels pending delivery and incomplete requests; true restores the cycle where possible.
          type: boolean
        expectedStatus:
          description: Current Glow Moments cycle status read from performance.operations.get.
          enum:
            - SCHEDULED
            - SENT
            - CANCELLED
          type: string
      required:
        - cycleId
        - expectedStatus
        - enabled
      type: object
    GlowMomentsCycleStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        cycleId:
          type: string
        enabled:
          type: boolean
        flowId:
          type: string
        previousStatus:
          type: string
        status:
          type: string
      required:
        - cycleId
        - flowId
        - previousStatus
        - status
        - enabled
        - changed
      type: object
    GlowMomentsCycleStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: glowMoments.cycle.status.set
        input:
          $ref: "#/components/schemas/GlowMomentsCycleStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: glowMoments.cycle.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only after performance.operations.get when the user explicitly asks to cancel or restore that exact Glow Moments cycle
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TeamPulseSendInput:
      additionalProperties: false
      properties:
        expectedFlowStatus:
          const: ACTIVE
          default: ACTIVE
          description: The Flow must still be ACTIVE when the confirmed send executes.
          type: string
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
      type: object
    TeamPulseSendResult:
      additionalProperties: true
      properties:
        flowId:
          type: string
        queued:
          type: boolean
        scheduledFor:
          type: string
      required:
        - flowId
        - queued
        - scheduledFor
      type: object
    TeamPulseSendPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: teamPulse.send
        input:
          $ref: "#/components/schemas/TeamPulseSendInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: teamPulse.send
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to send Team Pulse now; publishing alone follows the configured cadence and is not a manual-send request
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TeamPulseCycleStatusSetInput:
      additionalProperties: false
      properties:
        cycleId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        enabled:
          description: False cancels pending delivery and incomplete requests; true restores the cycle where possible.
          type: boolean
        expectedStatus:
          description: Current Team Pulse cycle status read from performance.operations.get.
          enum:
            - SCHEDULED
            - PROCESSING
            - SENT
            - CANCELLED
            - FAILED
          type: string
      required:
        - cycleId
        - expectedStatus
        - enabled
      type: object
    TeamPulseCycleStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        cycleId:
          type: string
        enabled:
          type: boolean
        flowId:
          type: string
        previousStatus:
          type: string
        status:
          type: string
      required:
        - cycleId
        - flowId
        - previousStatus
        - status
        - enabled
        - changed
      type: object
    TeamPulseCycleStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: teamPulse.cycle.status.set
        input:
          $ref: "#/components/schemas/TeamPulseCycleStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: teamPulse.cycle.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only after performance.operations.get when the user explicitly asks to cancel or restore that exact Team Pulse cycle
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksListInput:
      additionalProperties: false
      properties:
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - id
          type: object
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
        selectedApplicantStatus:
          default:
            - new
            - inProgress
            - shortlisted
          description: Defaults to current Checks. Pass an empty array to include every authorized Check status.
          items:
            enum:
              - new
              - archived
              - inProgress
              - shortlisted
              - rejected
              - selected
            type: string
          maxItems: 100
          type: array
        selectedFlows:
          default: []
          description: Exact Flow IDs. A non-empty list automatically enables the Flow filter.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
      type: object
    ChecksListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              firstName:
                type:
                  - string
                  - "null"
              flowId:
                type:
                  - string
                  - "null"
              lastName:
                type:
                  - string
                  - "null"
              status:
                type:
                  - string
                  - "null"
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    ChecksAnalyticsInput:
      additionalProperties: false
      properties:
        limit:
          default: 25
          maximum: 100
          minimum: 1
          type: integer
        offset:
          default: 0
          maximum: 999
          minimum: 0
          type: integer
        selectedApplicantStatus:
          default:
            - new
            - inProgress
            - shortlisted
          description: Defaults to current Checks. Pass an empty array to include every authorized Check status.
          items:
            enum:
              - new
              - archived
              - inProgress
              - shortlisted
              - rejected
              - selected
            type: string
          maxItems: 100
          type: array
        selectedFlows:
          default: []
          description: Exact Flow IDs. Empty means every otherwise-authorized Flow, subject to the cohort bound.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 20
          type: array
      type: object
    ChecksAnalyticsResult:
      additionalProperties: true
      properties:
        evaluatedCandidateCount:
          type: number
        exactCohort:
          type: boolean
        flowCohorts:
          items:
            additionalProperties: true
            type: object
          type: array
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              applicantId:
                type: string
              detailOperation:
                type: string
              evidenceSummary:
                type: string
              matchingScore:
                type:
                  - number
                  - "null"
              matchingScorePercent:
                type:
                  - number
                  - "null"
              name:
                type: string
              rankWithinFlow:
                type:
                  - number
                  - "null"
              scoredCandidateCount:
                type: number
            type: object
          type: array
        nextOffset:
          type:
            - number
            - "null"
        offset:
          type: number
        returnedCandidateCount:
          type: number
        safety:
          additionalProperties: true
          type: object
      required:
        - items
        - flowCohorts
        - evaluatedCandidateCount
        - returnedCandidateCount
        - offset
        - nextOffset
        - exactCohort
        - hasMore
        - safety
      type: object
    ChecksGetInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        includeEvidence:
          default: true
          description: Include the authorized evidence view. Set false only when profile metadata is sufficient.
          type: boolean
      required:
        - applicantId
      type: object
    ChecksGetResult:
      additionalProperties: true
      properties:
        evidence:
          additionalProperties: true
          type:
            - object
            - "null"
        evidenceIncluded:
          type: boolean
        profile:
          additionalProperties: true
          type: object
      required:
        - profile
        - evidenceIncluded
        - evidence
      type: object
    ChecksReportInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - applicantId
      type: object
    ChecksReportResult:
      additionalProperties: true
      properties:
        assessment:
          additionalProperties: true
          type:
            - object
            - "null"
        company:
          additionalProperties: true
          type:
            - object
            - "null"
        crossVerifiedAttributeScores:
          items:
            additionalProperties: true
            type: object
          type: array
        flow:
          additionalProperties: true
          type:
            - object
            - "null"
        flowRequest:
          additionalProperties: true
          type:
            - object
            - "null"
        keyAchievements:
          items:
            additionalProperties: true
            type: object
          type: array
        matchingScore:
          type:
            - number
            - "null"
        preScreening:
          additionalProperties: true
          type:
            - object
            - "null"
        references:
          items:
            additionalProperties: true
            type: object
          type: array
        referencesAvgMetrics:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - flow
        - company
        - flowRequest
        - preScreening
        - assessment
        - references
        - referencesAvgMetrics
        - crossVerifiedAttributeScores
        - keyAchievements
        - matchingScore
      type: object
    ChecksVerificationsGetInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - applicantId
      type: object
    ChecksVerificationsGetResult:
      additionalProperties: true
      properties:
        applicantId:
          type: string
        canRunAny:
          type: boolean
        serviceUnavailable:
          type: boolean
        verificationEligibility:
          additionalProperties: true
          type: object
        verifications:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - applicantId
        - canRunAny
        - verifications
        - verificationEligibility
      type: object
    ChecksVerificationsRunAllInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - applicantId
      type: object
    ChecksVerificationsRunAllResult:
      additionalProperties: true
      properties:
        applicantId:
          type: string
        runGroupId:
          type: string
        runs:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - applicantId
        - runGroupId
        - runs
      type: object
    ChecksVerificationsRunAllPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.verifications.runAll
        input:
          $ref: "#/components/schemas/ChecksVerificationsRunAllInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.verifications.runAll
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use when an external event should start the Run All Checks workflow; verification types that require unavailable applicant details are skipped
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksVerificationsRunAllExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.verifications.runAll
        input:
          $ref: "#/components/schemas/ChecksVerificationsRunAllInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: checks.verifications.runAll
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use when an external event should start the Run All Checks workflow; verification types that require unavailable applicant details are skipped
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksPublicProfilesGetInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - applicantId
      type: object
    ChecksPublicProfilesGetResult:
      additionalProperties: true
      properties:
        entitled:
          type: boolean
        latestRun:
          additionalProperties: true
          type:
            - object
            - "null"
        previousCompletedRun:
          additionalProperties: true
          type:
            - object
            - "null"
        serviceUnavailable:
          type: boolean
        subjectRef:
          additionalProperties: true
          type: object
      required:
        - subjectRef
        - latestRun
        - entitled
      type: object
    ChecksPublicProfilesFindInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        profileMatchingDetails:
          additionalProperties: false
          description: Optional corroborating identity and location hints. Jointl also reuses the Check name, email, stored verification location, and confirmed profile links.
          properties:
            aliases:
              items:
                maxLength: 256
                minLength: 1
                type: string
              maxItems: 8
              type: array
            cities:
              items:
                maxLength: 128
                minLength: 1
                type: string
              maxItems: 8
              type: array
            fullName:
              maxLength: 256
              minLength: 1
              type: string
            profileUrls:
              items:
                maxLength: 2048
                minLength: 1
                type: string
              maxItems: 16
              type: array
            relevantCountries:
              items:
                pattern: ^[A-Za-z]{2}$
                type: string
              maxItems: 12
              type: array
            states:
              items:
                maxLength: 128
                minLength: 1
                type: string
              maxItems: 8
              type: array
          type: object
      required:
        - applicantId
      type: object
    ChecksPublicProfilesFindResult:
      additionalProperties: true
      properties:
        alreadyRunning:
          type: boolean
        applicantId:
          type: string
        matchCount:
          type: number
        rescored:
          type: boolean
        runId:
          type: string
        status:
          type: string
      required:
        - applicantId
        - runId
        - status
      type: object
    ChecksPublicProfilesFindPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.publicProfiles.find
        input:
          $ref: "#/components/schemas/ChecksPublicProfilesFindInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.publicProfiles.find
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use when an external event should start the Find Profiles workflow; provide only known identity, location, or profile-URL hints and never speculative personal data
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksPublicProfilesFindExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.publicProfiles.find
        input:
          $ref: "#/components/schemas/ChecksPublicProfilesFindInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: checks.publicProfiles.find
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - zapier
      x-jointl-mcp-exposed: false
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use when an external event should start the Find Profiles workflow; provide only known identity, location, or profile-URL hints and never speculative personal data
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ReferencesListInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - id
          type: object
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
      required:
        - applicantId
      type: object
    ReferencesListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              applicantId:
                type: string
              createdAt:
                type: string
              id:
                type: string
              status:
                type: string
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    ReferencesGetInput:
      additionalProperties: false
      properties:
        referenceId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - referenceId
      type: object
    ReferencesGetResult:
      additionalProperties: true
      type: object
    EmployeesListInput:
      additionalProperties: false
      properties:
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              pattern: ^\d{4}-\d{2}-\d{2}$
              type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - id
          type: object
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
        selectedCompanies:
          default: []
          description: Exact Jointl company IDs; empty means every authorized company.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        selectedEmployeeStatus:
          default:
            - active
          description: Defaults to active Employees. Pass an empty array to include every authorized Employee status.
          items:
            enum:
              - active
              - left
            type: string
          maxItems: 100
          type: array
        selectedTags:
          default: []
          description: Exact Jointl tag IDs; empty means every tag.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
      type: object
    EmployeesListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              companyId:
                type:
                  - string
                  - "null"
              fullName:
                type: string
              positionTitle:
                type:
                  - string
                  - "null"
              status:
                type:
                  - string
                  - "null"
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    EmployeesAnalyticsInput:
      additionalProperties: false
      properties:
        endDate:
          description: Inclusive UTC evidence end date in YYYY-MM-DD. Omit both dates for the trailing six-month default.
          pattern: ^\d{4}-\d{2}-\d{2}$
          type: string
        limit:
          default: 25
          maximum: 100
          minimum: 1
          type: integer
        offset:
          default: 0
          maximum: 499
          minimum: 0
          type: integer
        selectedCompanies:
          default: []
          description: Exact Jointl company IDs; empty means every authorized company, subject to the cohort bound.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        selectedEmployeeStatus:
          default:
            - active
          description: Defaults to active Employees. Pass an empty array to include every authorized Employee status.
          items:
            enum:
              - active
              - left
            type: string
          maxItems: 100
          type: array
        selectedTags:
          default: []
          description: Exact Jointl tag IDs; empty means every tag.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        startDate:
          description: Inclusive UTC evidence start date in YYYY-MM-DD. Omit both dates for the trailing six-month default.
          pattern: ^\d{4}-\d{2}-\d{2}$
          type: string
      type: object
    EmployeesAnalyticsResult:
      additionalProperties: true
      properties:
        evaluatedEmployeeCount:
          type: number
        evidenceWindow:
          additionalProperties: true
          properties:
            endDate:
              type:
                - string
                - "null"
            inclusive:
              type: boolean
            startDate:
              type:
                - string
                - "null"
            timeZone:
              type: string
          required:
            - startDate
            - endDate
            - inclusive
            - timeZone
          type: object
        exactCohort:
          type: boolean
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              attentionSignals:
                items:
                  type: string
                type: array
              detailOperation:
                type: string
              employeeId:
                type: string
              evidenceSummary:
                type: string
              name:
                type: string
              performanceScore:
                type:
                  - number
                  - "null"
              performanceScorePercent:
                type:
                  - number
                  - "null"
              rankWithinVisibleCohort:
                type:
                  - number
                  - "null"
              visibleCohortSize:
                type: number
            type: object
          type: array
        nextOffset:
          type:
            - number
            - "null"
        offset:
          type: number
        returnedEmployeeCount:
          type: number
        safety:
          additionalProperties: true
          type: object
        scoredEmployeeCount:
          type: number
      required:
        - items
        - evaluatedEmployeeCount
        - scoredEmployeeCount
        - returnedEmployeeCount
        - offset
        - nextOffset
        - evidenceWindow
        - exactCohort
        - hasMore
        - safety
      type: object
    EmployeesGetInput:
      additionalProperties: false
      properties:
        employeeId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        includeEvidence:
          default: true
          description: Include the authorized evidence view. Set false only when profile metadata is sufficient.
          type: boolean
      required:
        - employeeId
      type: object
    EmployeesGetResult:
      additionalProperties: true
      properties:
        evidence:
          additionalProperties: true
          type:
            - object
            - "null"
        evidenceIncluded:
          type: boolean
        profile:
          additionalProperties: true
          type: object
      required:
        - profile
        - evidenceIncluded
        - evidence
      type: object
    EmployeesExitIntelligenceGetInput:
      additionalProperties: false
      properties:
        employeeId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        requestId:
          description: Optional exact Exit Intelligence request ID from a trigger; omitted means the latest visible request.
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - employeeId
      type: object
    EmployeesExitIntelligenceGetResult:
      additionalProperties: true
      properties:
        employee:
          additionalProperties: true
          type: object
        requests:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - employee
        - requests
      type: object
    TalentsListInput:
      additionalProperties: false
      properties:
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            id:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
            linkedInVerifiedReferences:
              type: number
            referencesCompleted:
              type: number
            referenceScore:
              type: number
            sourceRank:
              enum:
                - 0
                - 1
              type: number
          required:
            - sourceRank
            - createdAt
            - id
          type: object
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
        selectedAttributes:
          default: []
          description: Exact extracted attribute values.
          items:
            maxLength: 180
            minLength: 1
            type: string
          maxItems: 100
          type: array
        selectedCompanies:
          default: []
          description: Exact extracted company-name values; these are labels, not Jointl company IDs.
          items:
            maxLength: 180
            minLength: 1
            type: string
          maxItems: 100
          type: array
        selectedExperience:
          default: []
          description: "Experience-range IDs: 0-2, 3-5, 6-9, or 10-plus."
          items:
            enum:
              - 0-2
              - 3-5
              - 6-9
              - 10-plus
            type: string
          maxItems: 4
          type: array
        selectedIndustries:
          default: []
          description: Exact extracted industry values.
          items:
            maxLength: 180
            minLength: 1
            type: string
          maxItems: 100
          type: array
        selectedRoles:
          default: []
          description: Exact extracted current or prior job-title values.
          items:
            maxLength: 180
            minLength: 1
            type: string
          maxItems: 100
          type: array
        selectedTalentStatus:
          default: []
          items:
            enum:
              - new
              - archived
              - shortlisted
            type: string
          maxItems: 100
          type: array
      type: object
    TalentsListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              firstName:
                type:
                  - string
                  - "null"
              lastName:
                type:
                  - string
                  - "null"
              status:
                type:
                  - string
                  - "null"
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    TalentsGetInput:
      additionalProperties: false
      properties:
        includeEvidence:
          default: true
          description: Include the authorized evidence view. Set false only when profile metadata is sufficient.
          type: boolean
        talentId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - talentId
      type: object
    TalentsGetResult:
      additionalProperties: true
      properties:
        evidence:
          additionalProperties: true
          type:
            - object
            - "null"
        evidenceIncluded:
          type: boolean
        profile:
          additionalProperties: true
          type: object
      required:
        - profile
        - evidenceIncluded
        - evidence
      type: object
    TalentsReferencesListInput:
      additionalProperties: false
      properties:
        talentId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - talentId
      type: object
    TalentsReferencesListResult:
      additionalProperties: true
      properties:
        avgMetrics:
          items:
            additionalProperties: true
            type: object
          type: array
        references:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - references
        - avgMetrics
      type: object
    AutopilotsListInput:
      additionalProperties: false
      properties:
        cursor:
          additionalProperties: false
          properties:
            createdAt:
              anyOf:
                - format: date-time
                  type: string
                - format: date-time
                  type: string
            groupId:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          required:
            - createdAt
            - groupId
          type: object
        includeArchived:
          default: false
          description: Include archived Autopilots as well as active Autopilots.
          type: boolean
        limit:
          default: 100
          maximum: 200
          minimum: 1
          type: integer
      type: object
    AutopilotsListResult:
      additionalProperties: true
      properties:
        hasMore:
          type: boolean
        items:
          items:
            additionalProperties: true
            properties:
              _id:
                type: string
              checksTotal:
                type: number
              flowId:
                type: string
              status:
                type: string
              title:
                type: string
            type: object
          type: array
        nextCursor:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - items
        - hasMore
        - nextCursor
      type: object
    AutopilotsGetInput:
      additionalProperties: false
      properties:
        autopilotGroupId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - autopilotGroupId
      type: object
    AutopilotsGetResult:
      additionalProperties: true
      properties:
        autopilotGroupId:
          type: string
        capabilityWarning:
          type: string
        checksTotal:
          type: number
        createdAt:
          type: string
        flowId:
          type: string
        publicLinks:
          items:
            type: string
          type: array
        status:
          type: string
        title:
          type: string
      required:
        - autopilotGroupId
        - flowId
        - title
        - status
        - createdAt
        - checksTotal
        - publicLinks
        - capabilityWarning
      type: object
    InsightsGetInput:
      additionalProperties: false
      properties:
        endDate:
          description: Inclusive UTC end date in YYYY-MM-DD. Omit both dates for the trailing six-month default.
          pattern: ^\d{4}-\d{2}-\d{2}$
          type: string
        selectedCompanies:
          default: []
          description: Exact authorized Jointl company IDs; empty means every authorized company.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        selectedFlows:
          default: []
          description: Exact authorized Flow IDs; empty means every authorized Flow for this view.
          items:
            maxLength: 128
            minLength: 1
            pattern: ^[A-Za-z0-9_-]+$
            type: string
          maxItems: 100
          type: array
        selectedRoles:
          default: []
          description: Exact Employee role-title labels; empty means every authorized role.
          items:
            maxLength: 180
            minLength: 1
            type: string
          maxItems: 100
          type: array
        startDate:
          description: Inclusive UTC start date in YYYY-MM-DD. Omit both dates for the trailing six-month default.
          pattern: ^\d{4}-\d{2}-\d{2}$
          type: string
        view:
          default: general
          description: general maps to /insights, performance to /insights?view=performance, and exitIntelligence to /insights?view=exit-intelligence.
          enum:
            - general
            - performance
            - exitIntelligence
          type: string
      type: object
    InsightsGetResult:
      additionalProperties: true
      properties:
        data:
          additionalProperties: true
          type: object
        dateRange:
          additionalProperties: true
          properties:
            endDate:
              type: string
            inclusive:
              type: boolean
            startDate:
              type: string
            timeZone:
              type: string
          required:
            - startDate
            - endDate
            - inclusive
            - timeZone
          type: object
        filters:
          additionalProperties: true
          properties:
            companyIds:
              items:
                type: string
              type: array
            flowIds:
              items:
                type: string
              type: array
            roleTitles:
              items:
                type: string
              type: array
          required:
            - companyIds
            - flowIds
            - roleTitles
          type: object
        view:
          type: string
      required:
        - view
        - dateRange
        - filters
        - data
      type: object
    EventsListInput:
      additionalProperties: false
      properties:
        eventType:
          enum:
            - check.created
            - check.status_changed
            - check.completed
            - verification.completed
            - verification.failed
            - public_profiles.completed
            - public_profiles.failed
            - reference.completed
            - employee.created
            - employee.updated
            - employee.status_changed
            - exit_intelligence.requested
            - exit_intelligence.completed
            - talent.created
            - talent.updated
            - talent.status_changed
          type: string
        filters:
          additionalProperties: false
          default: {}
          properties:
            changedField:
              enum:
                - full_name
                - email
                - work_record
                - company
                - position_title
                - manager
                - tags
                - start_date
                - end_date
                - compensation
                - profile
                - status
                - other
              type: string
            companyId:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
            flowId:
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
          type: object
        limit:
          default: 3
          maximum: 3
          minimum: 1
          type: integer
      required:
        - eventType
      type: object
    EventsListResult:
      additionalProperties: true
      properties:
        items:
          items:
            additionalProperties: true
            type: object
          type: array
      required:
        - items
      type: object
    EventsGetInput:
      additionalProperties: false
      properties:
        eventId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - eventId
      type: object
    EventsGetResult:
      additionalProperties: true
      type: object
    FlowsDraftCreateInput:
      additionalProperties: false
      properties:
        design:
          additionalProperties: false
          properties:
            authoredTemplates:
              additionalProperties: false
              default: {}
              description: Original template/question blocks to create with this draft. Every evaluative multiple-choice question uses explicit non-flat option scores; Tests may also use native scale scoring. Open text is qualitative context without an attribute; unsupported types and automation are rejected.
              properties:
                assessmentQuestions:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                assessmentTests:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                exitIntelligence:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                preScreening:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                references:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                teamPulse:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
              type: object
            clearCopyOverrideFields:
              default: []
              description: On a draft revision, reset only these existing copy overrides to Jointl defaults.
              items:
                enum:
                  - welcomeScreen
                  - referenceCheckingCandidateScreen
                  - thankYouScreen
                  - welcomeEmail
                  - reminderWelcomeEmail
                  - emailRequestToReferee
                  - reminderEmailRequestToReferee
                  - thankYouEmail
                  - teamPulseEmailRequestToEmployee
                  - teamPulseReminderEmailRequestToEmployee
                type: string
              maxItems: 10
              type: array
            companyId:
              description: Exact companies.list ID. Required for HIRING_REVIEW and must be within the member's current company access.
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
            copyOverrides:
              additionalProperties: false
              default: {}
              description: Override only copy whose native Jointl default materially conflicts with this Flow; omit ordinary defaults.
              properties:
                emailRequestToReferee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                referenceCheckingCandidateScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                reminderEmailRequestToReferee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                reminderWelcomeEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                teamPulseEmailRequestToEmployee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                teamPulseReminderEmailRequestToEmployee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                thankYouEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                thankYouScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                welcomeEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                welcomeScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
              type: object
            jobTitle:
              description: Job title assessed by a HIRING_REVIEW Flow; required for that type.
              maxLength: 80
              minLength: 1
              type: string
            matchingScoreAttributes:
              default: []
              description: Up to 15 job-related attributes used by Jointl Matching Score, deliberately ordered from highest to lowest importance. With N attributes, Jointl applies linear weights N through 1 in this exact order. Every Hiring Review attribute must have at least one selected or authored question with valid numeric scoring.
              items:
                maxLength: 120
                minLength: 1
                type: string
              maxItems: 15
              type: array
            performance:
              additionalProperties: false
              description: Required complete participant and cadence configuration for PERFORMANCE Flows; omit for other types.
              properties:
                employeeIds:
                  description: Exact visible Employee IDs who participate in enabled Glow Moments and Team Pulse cycles.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 250
                  type: array
                glowMoments:
                  additionalProperties: false
                  properties:
                    cadence:
                      additionalProperties: false
                      properties:
                        firstSendAt:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: ISO 8601 date-time for the first Glow Moments send.
                        interval:
                          enum:
                            - MONTHLY
                            - QUARTERLY
                          type: string
                        mode:
                          enum:
                            - ONE_TIME
                            - RECURRING
                          type: string
                        repeatUntil:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: Optional inclusive end date-time for a recurring cadence.
                      required:
                        - mode
                        - firstSendAt
                      type: object
                    enabled:
                      type: boolean
                  required:
                    - enabled
                  type: object
                teamPulse:
                  additionalProperties: false
                  properties:
                    cadence:
                      additionalProperties: false
                      properties:
                        firstSendAt:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: ISO 8601 date-time for the first Team Pulse send.
                        interval:
                          enum:
                            - MONTHLY
                            - QUARTERLY
                            - SEMI_ANNUAL
                          type: string
                        mode:
                          enum:
                            - ONE_TIME
                            - RECURRING
                          type: string
                        repeatUntil:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: Optional inclusive end date-time for a recurring cadence.
                      required:
                        - mode
                        - firstSendAt
                      type: object
                    enabled:
                      type: boolean
                  required:
                    - enabled
                  type: object
              required:
                - employeeIds
                - glowMoments
                - teamPulse
              type: object
            referenceCollection:
              additionalProperties: false
              description: Hiring Review reference collection mode and thresholds; omit for other Flow types.
              properties:
                method:
                  default: AUTO
                  enum:
                    - AUTO
                    - MANUAL
                  type: string
                minReferenceCount:
                  default: 3
                  maximum: 10
                  minimum: 1
                  type: integer
                minReferenceGap:
                  default: 1
                  maximum: 10
                  minimum: 0
                  type: integer
              type: object
            tagIds:
              default: []
              description: Existing Jointl tag IDs to attach.
              items:
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
              maxItems: 40
              type: array
            templateIds:
              additionalProperties: false
              default: {}
              description: Existing visible templates selected by category.
              properties:
                assessmentQuestions:
                  default: []
                  description: Existing assessment-question template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                assessmentTests:
                  default: []
                  description: Existing visible Test template IDs. Search Private and Public Test Libraries before authoring a new Test.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                exitIntelligence:
                  default: []
                  description: Existing Exit Intelligence template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                preScreening:
                  default: []
                  description: Existing pre-screening template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                references:
                  default: []
                  description: Existing reference template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                teamPulse:
                  default: []
                  description: Existing Team Pulse template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
              type: object
            title:
              description: Human-readable Flow title.
              maxLength: 80
              minLength: 1
              type: string
            type:
              description: Flow type. The allowed sections depend on this value.
              enum:
                - HIRING_REVIEW
                - EXIT_INTELLIGENCE
                - PERFORMANCE
              type: string
          required:
            - title
            - type
          type: object
      required:
        - design
      type: object
    FlowsDraftCreateResult:
      additionalProperties: true
      properties:
        configuration:
          additionalProperties: true
          type: object
        createdTemplateIds:
          additionalProperties: true
          type: object
        flowId:
          type: string
        publicProfilesEnabled:
          type: boolean
        revision:
          type: string
        status:
          type: string
        talentPoolEnabled:
          type: boolean
        title:
          type: string
        type:
          type: string
      required:
        - flowId
        - title
        - type
        - status
        - revision
        - createdTemplateIds
        - publicProfilesEnabled
        - talentPoolEnabled
        - configuration
      type: object
    FlowsDraftCreatePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: flows.draft.create
        input:
          $ref: "#/components/schemas/FlowsDraftCreateInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: flows.draft.create
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use after capabilities, companies, and relevant question/template discovery have produced a complete supported design and the user wants it saved as a new draft
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    FlowsDraftReviseInput:
      additionalProperties: false
      properties:
        design:
          additionalProperties: false
          properties:
            authoredTemplates:
              additionalProperties: false
              default: {}
              description: Original template/question blocks to create with this draft. Every evaluative multiple-choice question uses explicit non-flat option scores; Tests may also use native scale scoring. Open text is qualitative context without an attribute; unsupported types and automation are rejected.
              properties:
                assessmentQuestions:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                assessmentTests:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                exitIntelligence:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                preScreening:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                references:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
                teamPulse:
                  default: []
                  items:
                    additionalProperties: false
                    properties:
                      clientRef:
                        maxLength: 64
                        minLength: 1
                        pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                        type: string
                      confetti:
                        default: true
                        type: boolean
                      conversationMode:
                        default: true
                        type: boolean
                      questions:
                        items:
                          additionalProperties: false
                          properties:
                            aiFollowUpEnabled:
                              default: false
                              description: Enable only for a critical open-text question where a vague or incomplete answer needs an adaptive follow-up.
                              type: boolean
                            attribute:
                              description: One exact numeric evidence attribute from design.matchingScoreAttributes. Omit for open-text narratives and all other non-scored questions.
                              maxLength: 120
                              minLength: 1
                              type: string
                            clientRef:
                              maxLength: 64
                              minLength: 1
                              pattern: ^[A-Za-z0-9][A-Za-z0-9._-]*$
                              type: string
                            evidenceRole:
                              default: evaluative
                              description: Evaluative means the question produces a numeric Matching Score input and requires an attribute. Use context for qualitative narratives, logistics, consent, relationship context, or any other unscored prompt.
                              enum:
                                - evaluative
                                - context
                              type: string
                            insightsExtraction:
                              description: Enable for substantive Reference, Exit Intelligence, or Team Pulse narratives. Structured reference types default to enabled except employmentCheck.
                              type: boolean
                            maxAnswers:
                              default: 1
                              description: Maximum options a respondent may select. Use 1 for single-answer multiple choice; when the prompt states a limit such as “choose up to three”, set this to that exact limit.
                              maximum: 20
                              minimum: 1
                              type: integer
                            options:
                              items:
                                anyOf:
                                  - maxLength: 200
                                    minLength: 1
                                    type: string
                                  - additionalProperties: false
                                    properties:
                                      score:
                                        description: Non-negative numeric score for this answer. Required on every option of an evaluative multiple-choice question, with at least two distinct scores.
                                        maximum: 100
                                        minimum: 0
                                        type: number
                                      title:
                                        maxLength: 200
                                        minLength: 1
                                        type: string
                                    required:
                                      - title
                                    type: object
                              maxItems: 20
                              minItems: 2
                              type: array
                            prompt:
                              maxLength: 1500
                              minLength: 1
                              type: string
                            scoringPoints:
                              description: Optional start/end score mapping for an authored Test scale; reverse order enables reverse scoring.
                              items:
                                maximum: 100
                                minimum: -100
                                type: number
                              maxItems: 2
                              minItems: 2
                              type: array
                            type:
                              description: Question type. Reference forms also support the structured single-use types strengths, keyAchievements, weaknesses, reasonsForLeavingJob, and employmentCheck.
                              enum:
                                - shortText
                                - longText
                                - multipleChoice
                                - opinionScale
                                - rating
                                - precisionScale
                                - strengths
                                - keyAchievements
                                - weaknesses
                                - reasonsForLeavingJob
                                - employmentCheck
                              type: string
                          required:
                            - clientRef
                            - type
                            - prompt
                          type: object
                        maxItems: 50
                        minItems: 1
                        type: array
                      thankYouScreen:
                        additionalProperties: false
                        description: Optional form-specific completion copy; omit when the native template default fits.
                        properties:
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                      title:
                        maxLength: 120
                        minLength: 1
                        type: string
                      welcomeScreen:
                        additionalProperties: false
                        description: Optional form-specific welcome copy; omit when the native template default fits.
                        properties:
                          button:
                            default: Begin
                            maxLength: 80
                            minLength: 1
                            type: string
                          content:
                            description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                            maxLength: 6000
                            minLength: 1
                            type: string
                        required:
                          - content
                        type: object
                    required:
                      - clientRef
                      - title
                      - questions
                    type: object
                  maxItems: 10
                  type: array
              type: object
            clearCopyOverrideFields:
              default: []
              description: On a draft revision, reset only these existing copy overrides to Jointl defaults.
              items:
                enum:
                  - welcomeScreen
                  - referenceCheckingCandidateScreen
                  - thankYouScreen
                  - welcomeEmail
                  - reminderWelcomeEmail
                  - emailRequestToReferee
                  - reminderEmailRequestToReferee
                  - thankYouEmail
                  - teamPulseEmailRequestToEmployee
                  - teamPulseReminderEmailRequestToEmployee
                type: string
              maxItems: 10
              type: array
            companyId:
              description: Exact companies.list ID. Required for HIRING_REVIEW and must be within the member's current company access.
              maxLength: 128
              minLength: 1
              pattern: ^[A-Za-z0-9_-]+$
              type: string
            copyOverrides:
              additionalProperties: false
              default: {}
              description: Override only copy whose native Jointl default materially conflicts with this Flow; omit ordinary defaults.
              properties:
                emailRequestToReferee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                referenceCheckingCandidateScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                reminderEmailRequestToReferee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                reminderWelcomeEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                teamPulseEmailRequestToEmployee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                teamPulseReminderEmailRequestToEmployee:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                thankYouEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                thankYouScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                welcomeEmail:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
                welcomeScreen:
                  description: "Plain text only; separate title and paragraphs with newlines. Supported ##...## placeholders are preserved."
                  maxLength: 6000
                  minLength: 1
                  type: string
              type: object
            jobTitle:
              description: Job title assessed by a HIRING_REVIEW Flow; required for that type.
              maxLength: 80
              minLength: 1
              type: string
            matchingScoreAttributes:
              default: []
              description: Up to 15 job-related attributes used by Jointl Matching Score, deliberately ordered from highest to lowest importance. With N attributes, Jointl applies linear weights N through 1 in this exact order. Every Hiring Review attribute must have at least one selected or authored question with valid numeric scoring.
              items:
                maxLength: 120
                minLength: 1
                type: string
              maxItems: 15
              type: array
            performance:
              additionalProperties: false
              description: Required complete participant and cadence configuration for PERFORMANCE Flows; omit for other types.
              properties:
                employeeIds:
                  description: Exact visible Employee IDs who participate in enabled Glow Moments and Team Pulse cycles.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 250
                  type: array
                glowMoments:
                  additionalProperties: false
                  properties:
                    cadence:
                      additionalProperties: false
                      properties:
                        firstSendAt:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: ISO 8601 date-time for the first Glow Moments send.
                        interval:
                          enum:
                            - MONTHLY
                            - QUARTERLY
                          type: string
                        mode:
                          enum:
                            - ONE_TIME
                            - RECURRING
                          type: string
                        repeatUntil:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: Optional inclusive end date-time for a recurring cadence.
                      required:
                        - mode
                        - firstSendAt
                      type: object
                    enabled:
                      type: boolean
                  required:
                    - enabled
                  type: object
                teamPulse:
                  additionalProperties: false
                  properties:
                    cadence:
                      additionalProperties: false
                      properties:
                        firstSendAt:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: ISO 8601 date-time for the first Team Pulse send.
                        interval:
                          enum:
                            - MONTHLY
                            - QUARTERLY
                            - SEMI_ANNUAL
                          type: string
                        mode:
                          enum:
                            - ONE_TIME
                            - RECURRING
                          type: string
                        repeatUntil:
                          anyOf:
                            - format: date-time
                              type: string
                            - format: date-time
                              type: string
                          description: Optional inclusive end date-time for a recurring cadence.
                      required:
                        - mode
                        - firstSendAt
                      type: object
                    enabled:
                      type: boolean
                  required:
                    - enabled
                  type: object
              required:
                - employeeIds
                - glowMoments
                - teamPulse
              type: object
            referenceCollection:
              additionalProperties: false
              description: Hiring Review reference collection mode and thresholds; omit for other Flow types.
              properties:
                method:
                  default: AUTO
                  enum:
                    - AUTO
                    - MANUAL
                  type: string
                minReferenceCount:
                  default: 3
                  maximum: 10
                  minimum: 1
                  type: integer
                minReferenceGap:
                  default: 1
                  maximum: 10
                  minimum: 0
                  type: integer
              type: object
            tagIds:
              default: []
              description: Existing Jointl tag IDs to attach.
              items:
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
              maxItems: 40
              type: array
            templateIds:
              additionalProperties: false
              default: {}
              description: Existing visible templates selected by category.
              properties:
                assessmentQuestions:
                  default: []
                  description: Existing assessment-question template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                assessmentTests:
                  default: []
                  description: Existing visible Test template IDs. Search Private and Public Test Libraries before authoring a new Test.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                exitIntelligence:
                  default: []
                  description: Existing Exit Intelligence template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                preScreening:
                  default: []
                  description: Existing pre-screening template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                references:
                  default: []
                  description: Existing reference template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
                teamPulse:
                  default: []
                  description: Existing Team Pulse template IDs.
                  items:
                    maxLength: 128
                    minLength: 1
                    pattern: ^[A-Za-z0-9_-]+$
                    type: string
                  maxItems: 40
                  type: array
              type: object
            title:
              description: Human-readable Flow title.
              maxLength: 80
              minLength: 1
              type: string
            type:
              description: Flow type. The allowed sections depend on this value.
              enum:
                - HIRING_REVIEW
                - EXIT_INTELLIGENCE
                - PERFORMANCE
              type: string
          required:
            - title
            - type
          type: object
        expectedRevision:
          anyOf:
            - format: date-time
              type: string
            - format: date-time
              type: string
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
        - expectedRevision
        - design
      type: object
    FlowsDraftReviseResult:
      additionalProperties: true
      properties:
        configuration:
          additionalProperties: true
          type: object
        createdTemplateIds:
          additionalProperties: true
          type: object
        flowId:
          type: string
        publicProfilesEnabled:
          type: boolean
        revision:
          type: string
        status:
          type: string
        talentPoolEnabled:
          type: boolean
        title:
          type: string
        type:
          type: string
      required:
        - flowId
        - title
        - type
        - status
        - revision
        - createdTemplateIds
        - publicProfilesEnabled
        - talentPoolEnabled
        - configuration
      type: object
    FlowsDraftRevisePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: flows.draft.revise
        input:
          $ref: "#/components/schemas/FlowsDraftReviseInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: flows.draft.revise
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only after flows.blueprint.get when the user wants to replace supported sections of that still-unpublished draft
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    FlowsStatusSetInput:
      additionalProperties: false
      properties:
        expectedStatus:
          description: Current status read from flows.get or flows.blueprint.get; used for concurrency safety.
          enum:
            - ACTIVE
            - DRAFT
            - ARCHIVED
          type: string
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        status:
          description: Publish/restore as ACTIVE or archive as ARCHIVED. Returning a Flow to DRAFT is unsupported.
          enum:
            - ACTIVE
            - ARCHIVED
          type: string
      required:
        - flowId
        - expectedStatus
        - status
      type: object
    FlowsStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    FlowsStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: flows.status.set
        input:
          $ref: "#/components/schemas/FlowsStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: flows.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to publish, activate, archive, or restore one known Flow; never infer a status change from scores or recommendations
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    FlowsDeleteInput:
      additionalProperties: false
      properties:
        expectedStatus:
          description: Current status read from flows.get or flows.blueprint.get; used to prevent a stale destructive action.
          enum:
            - ACTIVE
            - DRAFT
            - ARCHIVED
          type: string
        flowId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
        - expectedStatus
      type: object
    FlowsDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      type: object
    FlowsDeletePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: flows.delete
        input:
          $ref: "#/components/schemas/FlowsDeleteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: flows.delete
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: true
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to permanently delete one known Flow; offer flows.status.set with ARCHIVED when preserving history is acceptable
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksStatusSetInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          description: Current status read from checks.get or checks.list; used for concurrency safety.
          enum:
            - new
            - archived
            - inProgress
            - shortlisted
            - rejected
            - selected
          type: string
        status:
          description: New Check status. selected is intentionally excluded because selection creates an Employee.
          enum:
            - new
            - archived
            - inProgress
            - shortlisted
            - rejected
          type: string
      required:
        - applicantId
        - expectedStatus
        - status
      type: object
    ChecksStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    ChecksStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.status.set
        input:
          $ref: "#/components/schemas/ChecksStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to change one Check status; never shortlist or reject someone solely because an analysis, score, or ranking suggests it
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksStatusSetExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.status.set
        input:
          $ref: "#/components/schemas/ChecksStatusSetInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: checks.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to change one Check status; never shortlist or reject someone solely because an analysis, score, or ranking suggests it
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksDeleteInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          description: Current status read from checks.get or checks.list; used to prevent a stale destructive action.
          enum:
            - new
            - archived
            - inProgress
            - shortlisted
            - rejected
            - selected
          type: string
      required:
        - applicantId
        - expectedStatus
      type: object
    ChecksDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      type: object
    ChecksDeletePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.delete
        input:
          $ref: "#/components/schemas/ChecksDeleteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.delete
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: true
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to permanently delete one known Check; do not derive deletion from a score, rank, recommendation, or status
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesStatusSetInput:
      additionalProperties: false
      properties:
        employeeId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        exitIntelligenceFlowId:
          description: Optional active Exit Intelligence Flow to launch after marking the Employee left.
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          description: Current status read from employees.get or employees.list; used for concurrency safety.
          enum:
            - active
            - left
          type: string
        positionEndAt:
          description: One leaving date to apply to every active position. Do not combine with positionEndDates.
          pattern: ^\d{4}-\d{2}-\d{2}$
          type: string
        positionEndDates:
          default: []
          description: When marking left, provide an end date for every active position returned by employees.get.
          items:
            additionalProperties: false
            properties:
              endAt:
                pattern: ^\d{4}-\d{2}-\d{2}$
                type: string
              positionId:
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
            required:
              - positionId
              - endAt
            type: object
          maxItems: 50
          type: array
        status:
          enum:
            - active
            - left
          type: string
      required:
        - employeeId
        - expectedStatus
        - status
      type: object
    EmployeesStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    EmployeesStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.status.set
        input:
          $ref: "#/components/schemas/EmployeesStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: employees.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to mark a known Employee active or left and has supplied any required position end dates, or explicitly asks to send Exit Intelligence to an Employee already marked left; never infer this action from performance analytics
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesStatusSetExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.status.set
        input:
          $ref: "#/components/schemas/EmployeesStatusSetInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: employees.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to mark a known Employee active or left and has supplied any required position end dates, or explicitly asks to send Exit Intelligence to an Employee already marked left; never infer this action from performance analytics
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesDeleteInput:
      additionalProperties: false
      properties:
        employeeId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          description: Current status read from employees.get or employees.list; used to prevent a stale destructive action.
          enum:
            - active
            - left
          type: string
      required:
        - employeeId
        - expectedStatus
      type: object
    EmployeesDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      type: object
    EmployeesDeletePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.delete
        input:
          $ref: "#/components/schemas/EmployeesDeleteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: employees.delete
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: true
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to permanently delete one known Employee; do not derive deletion from performance evidence, rankings, or attention signals
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TalentsStatusSetInput:
      additionalProperties: false
      properties:
        expectedStatus:
          description: Current status read from talents.get or talents.list; used for concurrency safety.
          enum:
            - new
            - archived
            - shortlisted
          type: string
        status:
          enum:
            - new
            - archived
            - shortlisted
          type: string
        talentId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - talentId
        - expectedStatus
        - status
      type: object
    TalentsStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    TalentsStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: talents.status.set
        input:
          $ref: "#/components/schemas/TalentsStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: talents.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to change one Talent Pool status; never infer shortlisting from an analysis or ranking
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TalentsStatusSetExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: talents.status.set
        input:
          $ref: "#/components/schemas/TalentsStatusSetInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: talents.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to change one Talent Pool status; never infer shortlisting from an analysis or ranking
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    AutopilotsCreateInput:
      additionalProperties: false
      properties:
        flowId:
          description: Exact active Hiring Review Flow ID.
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        linkCount:
          default: 1
          description: Number of independent reusable public access links to generate.
          maximum: 20
          minimum: 1
          type: integer
      required:
        - flowId
      type: object
    AutopilotsCreateResult:
      additionalProperties: true
      properties:
        autopilotGroupId:
          type: string
        capabilityWarning:
          type: string
        flowId:
          type: string
        flowTitle:
          type: string
        publicLinks:
          items:
            type: string
          type: array
      required:
        - autopilotGroupId
        - flowId
        - flowTitle
        - publicLinks
        - capabilityWarning
      type: object
    AutopilotsCreatePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: autopilots.create
        input:
          $ref: "#/components/schemas/AutopilotsCreateInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: autopilots.create
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use when the user explicitly asks to run a new Autopilot or generate a new Autopilot link group for one exact active Flow
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    AutopilotsLinksGenerateInput:
      additionalProperties: false
      properties:
        autopilotGroupId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          const: ACTIVE
          default: ACTIVE
          description: Links can be added only while the Autopilot is ACTIVE.
          type: string
        linkCount:
          default: 1
          description: Number of independent reusable public access links to generate.
          maximum: 20
          minimum: 1
          type: integer
      required:
        - autopilotGroupId
      type: object
    AutopilotsLinksGenerateResult:
      additionalProperties: true
      properties:
        autopilotGroupId:
          type: string
        capabilityWarning:
          type: string
        flowId:
          type: string
        flowTitle:
          type: string
        publicLinks:
          items:
            type: string
          type: array
      required:
        - autopilotGroupId
        - flowId
        - flowTitle
        - publicLinks
        - capabilityWarning
      type: object
    AutopilotsLinksGeneratePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: autopilots.links.generate
        input:
          $ref: "#/components/schemas/AutopilotsLinksGenerateInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: autopilots.links.generate
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use when the user explicitly asks for more links on an existing known Autopilot; do not create a second Autopilot group for the same intent
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    AutopilotsStatusSetInput:
      additionalProperties: false
      properties:
        autopilotGroupId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          enum:
            - ACTIVE
            - ARCHIVED
          type: string
        status:
          enum:
            - ACTIVE
            - ARCHIVED
          type: string
      required:
        - autopilotGroupId
        - expectedStatus
        - status
      type: object
    AutopilotsStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    AutopilotsStatusSetPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: autopilots.status.set
        input:
          $ref: "#/components/schemas/AutopilotsStatusSetInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: autopilots.status.set
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to archive, disable, restore, or reactivate one known Autopilot
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    AutopilotsDeleteInput:
      additionalProperties: false
      properties:
        autopilotGroupId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        expectedStatus:
          description: Current status read from autopilots.get or autopilots.list; used to prevent a stale destructive action.
          enum:
            - ACTIVE
            - ARCHIVED
          type: string
      required:
        - autopilotGroupId
        - expectedStatus
      type: object
    AutopilotsDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        deletedCheckCount:
          type: number
        deletedLinkCount:
          type: number
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
        - deletedLinkCount
        - deletedCheckCount
      type: object
    AutopilotsDeletePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: autopilots.delete
        input:
          $ref: "#/components/schemas/AutopilotsDeleteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: autopilots.delete
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: true
      x-jointl-retry-safety: at-most-once
      x-jointl-standing-automation: false
      x-jointl-prerequisites: Use only when the user explicitly asks to permanently delete one known Autopilot; offer autopilots.status.set with ARCHIVED when disabling links while preserving Checks is acceptable
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ReferencesRequestInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        referee:
          additionalProperties: false
          properties:
            email:
              format: email
              maxLength: 254
              type: string
            name:
              maxLength: 180
              minLength: 1
              type: string
            phone:
              pattern: ^[1-9][0-9]{6,14}$
              type: string
            phoneMessageConsent:
              default: false
              type: boolean
          required:
            - name
            - email
          type: object
        templateId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - applicantId
        - templateId
        - referee
      type: object
    ReferencesRequestResult:
      additionalProperties: true
      properties:
        emailDispatch:
          additionalProperties: true
          type: object
        meta:
          additionalProperties: true
          type: object
        reference:
          additionalProperties: true
          type:
            - object
            - "null"
      required:
        - meta
        - reference
        - emailDispatch
      type: object
    ReferencesRequestPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: references.request
        input:
          $ref: "#/components/schemas/ReferencesRequestInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: references.request
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after resolving the Check and selecting a template from flows.referenceTemplates.list
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ReferencesRequestExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: references.request
        input:
          $ref: "#/components/schemas/ReferencesRequestInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: references.request
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after resolving the Check and selecting a template from flows.referenceTemplates.list
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksBulkCreateInput:
      additionalProperties: false
      properties:
        applicants:
          items:
            additionalProperties: false
            properties:
              email:
                format: email
                maxLength: 254
                type: string
              fullName:
                maxLength: 180
                minLength: 1
                type: string
              sourceRowNumber:
                description: Original one-based spreadsheet row number for preview and error reporting.
                maximum: 1000000
                minimum: 1
                type: integer
            required:
              - fullName
              - email
            type: object
          maxItems: 250
          minItems: 1
          type: array
        flowId:
          description: Exact authorized Hiring Review Flow ID.
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
      required:
        - flowId
        - applicants
      type: object
    ChecksBulkCreateResult:
      additionalProperties: true
      properties:
        checks:
          items:
            additionalProperties: true
            type: object
          type: array
        createdCount:
          type: number
        errorCount:
          type: number
      required:
        - createdCount
        - errorCount
        - checks
      type: object
    ChecksBulkCreatePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.bulkCreate
        input:
          $ref: "#/components/schemas/ChecksBulkCreateInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.bulkCreate
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after the client has parsed a file into validated fullName and email rows and resolved one authorized Flow ID; never pass a file or URL
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksBulkCreateExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.bulkCreate
        input:
          $ref: "#/components/schemas/ChecksBulkCreateInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: checks.bulkCreate
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after the client has parsed a file into validated fullName and email rows and resolved one authorized Flow ID; never pass a file or URL
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesBulkImportInput:
      additionalProperties: false
      properties:
        employees:
          items:
            additionalProperties: false
            properties:
              companyId:
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
              companyName:
                maxLength: 180
                minLength: 1
                type: string
              compensation:
                additionalProperties: false
                properties:
                  currency:
                    maxLength: 3
                    minLength: 3
                    type: string
                  effectiveAt:
                    pattern: ^\d{4}-\d{2}-\d{2}$
                    type: string
                  grossAmount:
                    minimum: 0
                    type: number
                  netAmount:
                    minimum: 0
                    type: number
                  payPeriod:
                    enum:
                      - annual
                      - monthly
                      - weekly
                      - daily
                      - hourly
                    type: string
                type: object
              email:
                format: email
                maxLength: 254
                type: string
              employeeId:
                description: Exact existing Employee ID. Required only in update mode.
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
              endAt:
                pattern: ^\d{4}-\d{2}-\d{2}$
                type: string
              fullName:
                maxLength: 180
                minLength: 1
                type: string
              managerColumnMapped:
                description: True only when the uploaded file explicitly mapped a manager column; false preserves an existing matching position manager.
                type: boolean
              managerName:
                description: Manager full name from the mapped column. Jointl resolves only an unambiguous existing Employee.
                maxLength: 180
                minLength: 1
                type: string
              positionId:
                description: Exact work-record ID on employeeId. Required only in update mode.
                maxLength: 128
                minLength: 1
                pattern: ^[A-Za-z0-9_-]+$
                type: string
              positionTitle:
                maxLength: 180
                minLength: 1
                type: string
              sourceRowNumber:
                description: Original one-based spreadsheet row number for preview and error reporting.
                maximum: 1000000
                minimum: 1
                type: integer
              startAt:
                pattern: ^\d{4}-\d{2}-\d{2}$
                type: string
              tagNames:
                description: Tag names parsed from the mapped column. Missing names are created only on confirmation.
                items:
                  maxLength: 100
                  minLength: 1
                  type: string
                maxItems: 50
                type: array
              tagsColumnMapped:
                description: True only when the uploaded file explicitly mapped a tags column; false preserves existing tags on a matching position.
                type: boolean
            required:
              - fullName
              - companyId
              - positionTitle
              - startAt
            type: object
          maxItems: 500
          minItems: 1
          type: array
        mode:
          default: upsert
          description: upsert applies Jointl Employee matching; create rejects existing matches; update requires exact employeeId and positionId values.
          enum:
            - upsert
            - create
            - update
          type: string
      required:
        - employees
      type: object
    EmployeesBulkImportResult:
      additionalProperties: true
      properties:
        createdCount:
          type: number
        employees:
          items:
            additionalProperties: true
            properties:
              email:
                type:
                  - string
                  - "null"
              employeeId:
                type: string
              fullName:
                type: string
              outcome:
                type: string
              positionIds:
                items:
                  type: string
                type: array
              rows:
                items:
                  type: number
                type: array
              status:
                type: string
              workRecords:
                items:
                  additionalProperties: true
                  properties:
                    companyId:
                      type: string
                    companyName:
                      type: string
                    endAt:
                      type:
                        - string
                        - "null"
                    positionId:
                      type: string
                    positionTitle:
                      type: string
                    startAt:
                      type: string
                  required:
                    - positionId
                    - companyId
                    - companyName
                    - positionTitle
                    - startAt
                  type: object
                type: array
            required:
              - employeeId
              - outcome
              - fullName
              - status
              - positionIds
              - workRecords
              - rows
            type: object
          type: array
        errorCount:
          type: number
        errors:
          items:
            additionalProperties: true
            properties:
              count:
                type: number
              reason:
                type: string
              rows:
                items:
                  type: number
                type: array
            required:
              - count
              - rows
              - reason
            type: object
          type: array
        unchangedCount:
          type: number
        updatedCount:
          type: number
      required:
        - createdCount
        - updatedCount
        - unchangedCount
        - errorCount
        - employees
        - errors
      type: object
    EmployeesBulkImportPrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.bulkImport
        input:
          $ref: "#/components/schemas/EmployeesBulkImportInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: employees.bulkImport
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after the client has parsed and validated Employee rows and resolved exact authorized company IDs; use create for Search-or-Create, update for one exact existing work record, and upsert for bulk imports; never pass a file or URL
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesBulkImportExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.bulkImport
        input:
          $ref: "#/components/schemas/EmployeesBulkImportInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: employees.bulkImport
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use after the client has parsed and validated Employee rows and resolved exact authorized company IDs; use create for Search-or-Create, update for one exact existing work record, and upsert for bulk imports; never pass a file or URL
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksAddNoteInput:
      additionalProperties: false
      properties:
        applicantId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        text:
          description: Exact note text the user asked to save.
          maxLength: 4000
          minLength: 1
          type: string
        visibleToTeam:
          default: false
          description: False keeps the note private to its author; true shares it with authorized workspace members.
          type: boolean
      required:
        - applicantId
        - text
      type: object
    ChecksAddNoteResult:
      type: boolean
    ChecksAddNotePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.addNote
        input:
          $ref: "#/components/schemas/ChecksAddNoteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: checks.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Check, after resolving its applicant ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    ChecksAddNoteExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: checks.addNote
        input:
          $ref: "#/components/schemas/ChecksAddNoteInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: checks.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Check, after resolving its applicant ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesAddNoteInput:
      additionalProperties: false
      properties:
        employeeId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        text:
          description: Exact note text the user asked to save.
          maxLength: 4000
          minLength: 1
          type: string
        visibleToTeam:
          default: false
          description: False keeps the note private to its author; true shares it with authorized workspace members.
          type: boolean
      required:
        - employeeId
        - text
      type: object
    EmployeesAddNoteResult:
      type: boolean
    EmployeesAddNotePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.addNote
        input:
          $ref: "#/components/schemas/EmployeesAddNoteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: employees.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Employee, after resolving its Employee ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    EmployeesAddNoteExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: employees.addNote
        input:
          $ref: "#/components/schemas/EmployeesAddNoteInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: employees.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Employee, after resolving its Employee ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TalentsAddNoteInput:
      additionalProperties: false
      properties:
        talentId:
          maxLength: 128
          minLength: 1
          pattern: ^[A-Za-z0-9_-]+$
          type: string
        text:
          description: Exact note text the user asked to save.
          maxLength: 4000
          minLength: 1
          type: string
        visibleToTeam:
          default: false
          description: False keeps the note private to its author; true shares it with authorized workspace members.
          type: boolean
      required:
        - talentId
        - text
      type: object
    TalentsAddNoteResult:
      type: boolean
    TalentsAddNotePrepareRequest:
      type: object
      properties:
        operationId:
          type: string
          const: talents.addNote
        input:
          $ref: "#/components/schemas/TalentsAddNoteInput"
        idempotencyKey:
          $ref: "#/components/schemas/IdempotencyKey"
      required:
        - operationId
        - input
        - idempotencyKey
      additionalProperties: false
      x-jointl-logical-operation: talents.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Talent Pool profile, after resolving its profile ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
    TalentsAddNoteExecuteRequest:
      type: object
      properties:
        operationId:
          type: string
          const: talents.addNote
        input:
          $ref: "#/components/schemas/TalentsAddNoteInput"
      required:
        - operationId
        - input
      additionalProperties: false
      x-jointl-logical-operation: talents.addNote
      x-jointl-scope: workspace.write
      x-jointl-audiences:
        - rest
        - mcp
      x-jointl-mcp-exposed: true
      x-jointl-confirmation-required: true
      x-jointl-destructive: false
      x-jointl-retry-safety: idempotent
      x-jointl-standing-automation: true
      x-jointl-prerequisites: Use only when the user explicitly asks to add text to one authorized Talent Pool profile, after resolving its profile ID
      x-jointl-side-effects: The exact effects are returned by the prepare preview and revalidated at confirmation.
  responses:
    BadRequest:
      description: Invalid request.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: invalid-external-operation-input
              message: The operation input is invalid.
            requestId: request_example_400
    Unauthorized:
      description: Authentication required.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: not-authenticated
              message: Authentication is required.
            requestId: request_example_401
    Forbidden:
      description: Insufficient scope or permission.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: not-authorized
              message: You are not allowed to perform this action.
            requestId: request_example_403
    NotFound:
      description: The operation or visible record was not found.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: not-found
              message: The requested record was not found.
            requestId: request_example_404
    Conflict:
      description: State, replay, or idempotency conflict.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: external-action-conflict
              message: The action conflicts with current state.
            requestId: request_example_409
    TooLarge:
      description: Request exceeds one MiB.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: request-too-large
              message: The request body is too large.
            requestId: request_example_413
    RateLimited:
      description: Rate limit exceeded.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
        Retry-After:
          $ref: "#/components/headers/RetryAfter"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: too-many-requests
              message: Too many requests.
            requestId: request_example_429
    ServerError:
      description: Server error.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: internal-error
              message: The request could not be completed.
            requestId: request_example_500
    Unavailable:
      description: Temporarily unavailable or action outcome unknown.
      headers:
        X-Request-Id:
          $ref: "#/components/headers/RequestId"
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorEnvelope"
          example:
            error:
              code: temporarily-unavailable
              message: The service is temporarily unavailable.
            requestId: request_example_503
    OAuthError:
      description: OAuth protocol error.
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
              error_description:
                type: string
            required:
              - error
x-jointl-limits:
  maxRequestBytes: 1048576
  requestsPerMinute:
    network: 300
    principalRead: 120
    principalWrite: 20
    oauthNetwork: 120
  confirmationTtlSeconds: 300
  completedConfirmationRetentionHours: 24
  standingReceiptRetentionDays: 70
x-jointl-audiences:
  rest: https://api.join.tl/api/v1
  mcp: https://mcp.join.tl
