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

# Confirm an approved prepared action

> Executes exactly the prepared input after explicit human approval and a current permission and record-state check.



## OpenAPI

````yaml /specs/openapi/jointl-api-v1.openapi.yaml post /api/v1/actions/confirm
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
servers:
  - url: https://api.join.tl
    description: Jointl production API
security: []
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:
  /api/v1/actions/confirm:
    post:
      tags:
        - Actions
      summary: Confirm an approved prepared action
      description: >-
        Executes exactly the prepared input after explicit human approval and a
        current permission and record-state check.
      operationId: confirmAction
      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'
      security:
        - JointlOAuth:
            - workspace.write
        - JointlApiKey: []
components:
  schemas:
    ActionConfirmRequest:
      type: object
      properties:
        confirmationToken:
          type: string
          minLength: 40
          maxLength: 256
      required:
        - confirmationToken
      additionalProperties: false
    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'
    GlowMomentsSendResult:
      additionalProperties: true
      properties:
        flowId:
          type: string
        queued:
          type: boolean
        scheduledFor:
          type: string
      required:
        - flowId
        - queued
        - scheduledFor
      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
    TeamPulseSendResult:
      additionalProperties: true
      properties:
        flowId:
          type: string
        queued:
          type: boolean
        scheduledFor:
          type: string
      required:
        - flowId
        - queued
        - scheduledFor
      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
    ChecksVerificationsRunAllResult:
      additionalProperties: true
      properties:
        applicantId:
          type: string
        runGroupId:
          type: string
        runs:
          type: array
          items:
            additionalProperties: true
            type: object
      required:
        - applicantId
        - runGroupId
        - runs
      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
    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
    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
    FlowsStatusSetResult:
      additionalProperties: true
      properties:
        changed:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
        status:
          type: string
      required:
        - recordId
        - previousStatus
        - status
        - changed
      type: object
    FlowsDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      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
    ChecksDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      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
    EmployeesDeleteResult:
      additionalProperties: true
      properties:
        deleted:
          type: boolean
        previousStatus:
          type: string
        recordId:
          type: string
      required:
        - recordId
        - previousStatus
        - deleted
      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
    AutopilotsCreateResult:
      additionalProperties: true
      properties:
        autopilotGroupId:
          type: string
        capabilityWarning:
          type: string
        flowId:
          type: string
        flowTitle:
          type: string
        publicLinks:
          type: array
          items:
            type: string
      required:
        - autopilotGroupId
        - flowId
        - flowTitle
        - publicLinks
        - capabilityWarning
      type: object
    AutopilotsLinksGenerateResult:
      additionalProperties: true
      properties:
        autopilotGroupId:
          type: string
        capabilityWarning:
          type: string
        flowId:
          type: string
        flowTitle:
          type: string
        publicLinks:
          type: array
          items:
            type: string
      required:
        - autopilotGroupId
        - flowId
        - flowTitle
        - publicLinks
        - capabilityWarning
      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
    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
    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
    ChecksBulkCreateResult:
      additionalProperties: true
      properties:
        checks:
          type: array
          items:
            additionalProperties: true
            type: object
        createdCount:
          type: number
        errorCount:
          type: number
      required:
        - createdCount
        - errorCount
        - checks
      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:
                type: array
                items:
                  type: string
              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
    ChecksAddNoteResult:
      type: boolean
    EmployeesAddNoteResult:
      type: boolean
    TalentsAddNoteResult:
      type: boolean
    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
  headers:
    RequestId:
      description: Request correlation identifier.
      schema:
        type: string
    RetryAfter:
      description: Seconds before retrying.
      schema:
        type: integer
        minimum: 1
  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
  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.

````