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

# Submit job application

> Submit a job application using a submission token. The application will be queued and processed asynchronously. Returns ID to track progress and match with webhooks.



## OpenAPI

````yaml POST /ai-apply/apply
openapi: 3.1.0
info:
  title: Kombo API
  version: 1.0.0
servers:
  - url: https://api.kombo.dev/v1
    description: Kombo EU API
  - url: https://api.us.kombo.dev/v1
    description: Kombo US API
security:
  - ApiKey: []
tags:
  - name: General
  - name: Kombo Connect
    description: >-
      Endpoints for Kombo Connect, our end-user-facing flow for setting up new
      integrations.
  - name: Unified HRIS API
    description: Unified endpoints to access all the HR concepts you might need.
  - name: Unified ATS API
    description: Unified endpoints to access all the ATS concepts you might need.
  - name: Unified ATS (Assessment & Background Check) API
    description: >-
      Unified endpoints to operate Assessments and Background Checks for many
      applicant tracking systems.
  - name: Unified LMS API
    description: Unified endpoints to access all the LMS concepts you might need.
  - name: AI Apply
    description: Endpoints for AI-powered job application features.
  - name: Custom Endpoints
    description: Custom integration-specific endpoints.
paths:
  /ai-apply/apply:
    post:
      tags:
        - AI Apply
      summary: Submit job application
      description: >-
        Submit a job application using a submission token. The application will
        be queued and processed asynchronously. Returns ID to track progress and
        match with webhooks.
      operationId: PostAiApplyApply
      requestBody:
        description: POST /ai-apply/apply Request body
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostAiApplyApplyRequestBody'
            examples:
              example1:
                value:
                  submission_token: <example-token>
                  candidate_email: john.doe@gmail.com
                  query_params:
                    source: acme
                    user_id: 8e05b4e5-c586-4d42-8606-b45febad3af3
                  screening_question_answers:
                    - question_id: A4zHtGQLF823sNmqy4WxoduFH
                      answer: John Doe
                    - question_id: CDEfHvMGSDnM6pq5HECdE2Kg
                      answer: EycufwZHfwcVDmE47X7QN8X2
                    - question_id: 3dT5df2PhyVp7Rze76S5NqrW
                      answer:
                        name: john_doe_resume.pdf
                        content_type: application/pdf
                        data: >-
                          JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iag==
                  additional_clicks: 10
                  additional_clicks_scatter_duration: 45
      responses:
        '200':
          description: POST /ai-apply/apply Positive response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostAiApplyApplyPositiveResponse'
              examples:
                example1:
                  value:
                    status: success
                    data:
                      id: ADbmw5XSkeCSE1fAucoxEGnwZ
                      posting_id: JDn252PEYa4rMhKbJBjtn3ng
                      status: PENDING
                      created_at: '2025-01-01T00:00:00.000Z'
                      updated_at: '2025-03-02T23:12:32.000Z'
        default:
          $ref: '#/components/responses/ErrorResponseAiApply'
components:
  schemas:
    PostAiApplyApplyRequestBody:
      type: object
      properties:
        submission_token:
          type: string
          description: >-
            Submission JWT paired with the exact application form being
            answered. Single-use tokens are valid for two days. Multi-use tokens
            have no time-based expiry.
        candidate_email:
          type: string
          description: >-
            The email address of the candidate, used for internal tracking and
            candidate account behavior. It does not prevent duplicate
            applications. This field is required but should not be displayed to
            the candidate on your application form - you should provide this
            from your own system.
          format: email
        query_params:
          type: object
          additionalProperties:
            type: string
          description: >-
            Query parameters to be appended to the job posting URL when
            applying.
        screening_question_answers:
          type: array
          items:
            type: object
            properties:
              question_id:
                type: string
                description: >-
                  The globally unique ID of this object generated by Kombo. We
                  recommend using this as a stable primary key for syncing.
              answer:
                oneOf:
                  - type: string
                    description: >-
                      Answer to a `TEXT` question, the option ID of the answer
                      to a `SINGLE_SELECT` question, or the answer to a `DATE`
                      question as an ISO 8601 date string (e.g.
                      "2021-12-31T23:59:59.000Z").
                  - type: array
                    items:
                      type: string
                    description: >-
                      Answer to a `MULTI_SELECT` question, contains the IDs of
                      the selected options.
                  - type: number
                    format: double
                    description: Answer to a `NUMBER` question.
                  - type: boolean
                    description: Answer to a `BOOLEAN` question.
                  - type: object
                    properties:
                      name:
                        type: string
                        description: The original name (e.g., "resume.pdf")
                      content_type:
                        type: string
                        description: >-
                          The MIME type of the file (e.g., "application/pdf",
                          "image/jpeg")
                      data:
                        type: string
                        description: The file content encoded as a base64 string
                    required:
                      - name
                      - content_type
                      - data
                    description: Answer to a `FILE` question.
            required:
              - question_id
              - answer
          description: >-
            Array of screening question answers. The answers need to match
            exactly with the application form received together with the
            submission token. Otherwise, the application will be rejected.
        additional_clicks:
          type: integer
          format: int64
          minimum: 0
          maximum: 30
          description: >-
            Number of times to simulate the job being opened in addition to the
            actual click related to the application. When set without
            `additional_clicks_scatter_duration`, uses the default 60-minute
            scatter window.
        additional_clicks_scatter_duration:
          type: integer
          format: int64
          minimum: 1
          description: >-
            Optional scatter window for `additional_clicks`, in minutes. Cannot
            be used without `additional_clicks`.
      required:
        - submission_token
        - candidate_email
        - screening_question_answers
    PostAiApplyApplyPositiveResponse:
      type: object
      properties:
        status:
          type: string
          const: success
        data:
          type: object
          properties:
            id:
              type: string
              description: >-
                The globally unique ID of this object generated by Kombo. We
                recommend using this as a stable primary key for syncing.
            posting_id:
              type: string
              description: >-
                The globally unique ID of this object generated by Kombo. We
                recommend using this as a stable primary key for syncing.
            status:
              type: string
            created_at:
              description: YYYY-MM-DDTHH:mm:ss.sssZ
              type: string
              format: date-time
              externalDocs:
                url: >-
                  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
            updated_at:
              description: YYYY-MM-DDTHH:mm:ss.sssZ
              type: string
              format: date-time
              externalDocs:
                url: >-
                  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
          required:
            - id
            - posting_id
            - status
            - created_at
            - updated_at
          examples:
            - id: ADbmw5XSkeCSE1fAucoxEGnwZ
              posting_id: JDn252PEYa4rMhKbJBjtn3ng
              status: PENDING
              created_at: '2025-01-01T00:00:00.000Z'
              updated_at: '2025-03-02T23:12:32.000Z'
      required:
        - status
        - data
  responses:
    ErrorResponseAiApply:
      description: The standard error response with the error codes for AI Apply.
      content:
        application/json:
          schema:
            type: object
            properties:
              status:
                type: string
                enum:
                  - error
              error:
                type: object
                properties:
                  code:
                    type:
                      - string
                      - 'null'
                    enum:
                      - PLATFORM.RATE_LIMIT_EXCEEDED
                      - PLATFORM.CONCURRENCY_LIMIT_EXCEEDED
                      - PLATFORM.INTEGRATION_NOT_FOUND
                      - PLATFORM.INPUT_INVALID
                      - PLATFORM.UNKNOWN_ERROR
                      - PLATFORM.IP_NOT_WHITELISTED
                      - PLATFORM.AUTHENTICATION_INVALID
                      - PLATFORM.TASK_TIMED_OUT
                      - REMOTE.SERVICE_UNAVAILABLE
                      - REMOTE.RATE_LIMIT_EXCEEDED
                      - REMOTE.INPUT_INVALID
                      - REMOTE.UNKNOWN_HTTP_ERROR
                      - AI_APPLY.JOB_FEED_IMPORT_ALREADY_RUNNING
                      - AI_APPLY.JOB_FEED_IMPORT_TIMED_OUT
                      - AI_APPLY.JOB_POSTING_ALREADY_EXISTS
                    example: ATS.JOB_CLOSED
                    description: >-
                      Some errors include an error code that can be used to
                      identify their cause. See the [Error Handling
                      Docs](https://docs.kombo.dev/guides/errors) for more
                      information. For your error handling logic please use the
                      error `code` instead of other properties (e.g. message,
                      http status code, ...).
                  title:
                    type:
                      - string
                      - 'null'
                    description: A static, human-readable label.
                  message:
                    type: string
                    description: >-
                      A dynamic, detailed description of what went wrong in this
                      specific instance.
                  log_url:
                    type:
                      - string
                      - 'null'
                    format: uri
                    description: >-
                      The log page in the Kombo UI lists every interaction with
                      full details. If you need assistance, share that link with
                      our support team.
                required:
                  - code
                  - title
                  - message
                  - log_url
                description: Error details with structured code for programmatic handling.
            required:
              - status
              - error
          examples:
            Error Response:
              description: >-
                When building error handling logic, always use the `code` field
                to identify specific error types programmatically. See the
                complete list of error codes in the
                [docs](https://docs.kombo.dev/guides/errors).
              value:
                status: error
                error:
                  code: INTEGRATION.MODEL_NOT_AVAILABLE
                  title: >-
                    This data model isn't supported for the selected
                    integration.
                  message: >-
                    The "employees" model is not yet available for Greenhouse.
                    Please reach out to Kombo if you need this functionality.
                  log_url: https://app.kombo.dev/my-prod/logs?interactionId=123456
            Minimal Error Response:
              description: >-
                The "message" is always required while other fields can also be
                `null`. See the [docs](https://docs.kombo.dev/guides/errors) for
                more information.
              value:
                status: error
                error:
                  code: null
                  title: null
                  message: The message is always in the response.
                  log_url: null
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      description: >-
        Create an API key on the [Secrets](https://app.kombo.dev/secrets) page
        in the Kombo dashboard.

````