LinkedIn Talent Solutions

The LinkedIn Talent Solutions enhances candidate sourcing and recruiting experience for ATSs and applications using the world's largest professional network. Follow the links below to learn more about the LinkedIn Talent Solutions APIs.

OpenAPI Specification

linkedin-talent-job-posting.yml Raw ↑
openapi: 3.1.0
info:
  title: LinkedIn Job Posting API
  description: >-
    LinkedIn's Job Posting API enables authorized third parties such as clients,
    ATS systems, and Job Distributors to post jobs directly to LinkedIn on behalf
    of customers.

    This API supports two job categories:

    - **Basic Jobs**: Free job posts gathered by LinkedIn from external sources
    - **Promoted Jobs**: Paid job postings with enhanced visibility

    The use of these APIs is restricted to developers approved by LinkedIn.
    Please reach out to your LinkedIn Relationship Manager or Business Development
    contact for access.

    For more information, refer to the
    [Job Posting Overview](https://docs.microsoft.com/en-us/linkedin/talent/job-postings/job-posting-overview).
  version: 1.0.0
  contact:
    name: LinkedIn Talent Solutions
    url: https://business.linkedin.com/talent-solutions

servers:
- url: https://api.linkedin.com
  description: LinkedIn Production API Server

tags:
- name: Apply Connect Jobs
  description: APIs for creating and managing Apply Connect enabled job postings
- name: Job Lifecycle Management
  description: APIs for managing the lifecycle of job postings
- name: Customer Integrations
  description: APIs for managing customer ATS integrations for premium job posting

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: OAuth 2.0 Bearer Token authentication

    OAuth2Auth:
      type: oauth2
      description: OAuth 2.0 authentication
      flows:
        clientCredentials:
          tokenUrl: https://www.linkedin.com/oauth/v2/accessToken
          scopes:
            w_organization_social: Write organization social content

  schemas:
    SimpleJobPostingRequest:
      type: object
      description: Request body for creating or updating job postings
      required:
      - elements
      properties:
        elements:
          type: array
          items:
            $ref: '#/components/schemas/JobPostingElement'

    JobPostingElement:
      type: object
      description: Individual job posting element
      required:
      - externalJobPostingId
      - title
      - description
      - integrationContext
      - listingType
      - location
      properties:
        externalJobPostingId:
          type: string
          description: External identifier for the job posting
          example: "JOB-2024-001"
        title:
          type: string
          description: Job title
          example: "Software Developer in Test"
        description:
          type: string
          description: Full job description
          example: "We are looking for a talented Software Developer in Test to join our engineering team..."
        integrationContext:
          type: string
          description: Organization URN for the job posting
          example: "urn:li:organization:12345678"
        jobPostingOperationType:
          type: string
          description: Operation type for the job posting
          enum:
          - CREATE
          - UPDATE
          - CLOSE
          example: "CREATE"
        listingType:
          type: string
          description: Type of job listing
          enum:
          - BASIC
          - PREMIUM
          example: "BASIC"
        listedAt:
          type: integer
          format: int64
          description: Timestamp when the job was listed
          example: 1702693664000
        location:
          type: string
          description: Job location
          example: "San Francisco, CA"
        companyApplyUrl:
          type: string
          format: uri
          description: URL for company's application page
          example: "https://company.com/careers/apply"
        onsiteApplyConfiguration:
          $ref: '#/components/schemas/OnsiteApplyConfiguration'

    OnsiteApplyConfiguration:
      type: object
      description: Configuration for onsite application collection
      properties:
        jobApplicationWebhookUrl:
          type: string
          format: uri
          description: Webhook URL for receiving job applications
          example: "https://ats.company.com/webhooks/linkedin-applications"
        questions:
          $ref: '#/components/schemas/ApplicationQuestions'

    ApplicationQuestions:
      type: object
      description: Questions configuration for job applications
      properties:
        resumeQuestions:
          $ref: '#/components/schemas/ResumeQuestions'
        coverLetterQuestions:
          $ref: '#/components/schemas/CoverLetterQuestions'
        voluntarySelfIdentificationQuestions:
          type: object
          description: Voluntary self-identification questions
        educationQuestions:
          $ref: '#/components/schemas/EducationQuestions'
        workQuestions:
          $ref: '#/components/schemas/WorkQuestions'
        additionalQuestions:
          $ref: '#/components/schemas/AdditionalQuestions'

    ResumeQuestions:
      type: object
      properties:
        resumeQuestionRequirement:
          type: string
          enum:
          - REQUIRED
          - OPTIONAL
          - NOT_AVAILABLE
          example: "REQUIRED"

    CoverLetterQuestions:
      type: object
      properties:
        coverLetterQuestionRequirement:
          type: string
          enum:
          - REQUIRED
          - OPTIONAL
          - NOT_AVAILABLE
          example: "OPTIONAL"

    EducationQuestions:
      type: object
      properties:
        educationExperienceQuestionSet:
          type: object

    WorkQuestions:
      type: object
      properties:
        workExperienceQuestionSet:
          type: object

    AdditionalQuestions:
      type: object
      properties:
        customQuestionSets:
          type: array
          items:
            $ref: '#/components/schemas/CustomQuestionSet'

    CustomQuestionSet:
      type: object
      properties:
        questionSetId:
          type: string
          example: "custom-questions-001"
        questions:
          type: array
          items:
            $ref: '#/components/schemas/CustomQuestion'

    CustomQuestion:
      type: object
      properties:
        required:
          type: boolean
          example: true
        partnerQuestionIdentifier:
          type: string
          example: "question-001"
        questionText:
          type: string
          example: "Are you authorized to work in the United States?"
        questionDetails:
          $ref: '#/components/schemas/QuestionDetails'

    QuestionDetails:
      type: object
      properties:
        multipleChoiceQuestionDetails:
          $ref: '#/components/schemas/MultipleChoiceQuestionDetails'

    MultipleChoiceQuestionDetails:
      type: object
      properties:
        choices:
          type: array
          items:
            $ref: '#/components/schemas/QuestionChoice'
        selectMultiple:
          type: boolean
          example: false
        preferredFormComponent:
          type: string
          enum:
          - RADIO_BUTTONS
          - DROPDOWN
          - CHECKBOXES
          example: "RADIO_BUTTONS"

    QuestionChoice:
      type: object
      properties:
        symbolicName:
          type: string
          example: "yes"
        displayValue:
          type: string
          example: "Yes"

    JobPostingResponse:
      type: object
      description: Response from job posting creation
      properties:
        elements:
          type: array
          items:
            $ref: '#/components/schemas/JobPostingResult'

    JobPostingResult:
      type: object
      properties:
        status:
          type: string
          example: "ACCEPTED"
        taskUrn:
          type: string
          description: URN of the task to track posting status
          example: "urn:li:simpleJobPostingTask:12345678"

    JobPostingTaskResponse:
      type: object
      description: Response for job posting task status
      properties:
        results:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/JobPostingTaskResult'

    JobPostingTaskResult:
      type: object
      properties:
        status:
          type: string
          enum:
          - PENDING
          - SUCCEEDED
          - FAILED
          example: "SUCCEEDED"
        jobPostingUrn:
          type: string
          description: URN of the created job posting
          example: "urn:li:jobPosting:2722131308"
        errorMessage:
          type: string
          description: Error message if task failed

          example: example_value
    AtsIntegrationUpdateRequest:
      type: object
      description: Request body for updating ATS integrations
      properties:
        entities:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/AtsIntegrationPatch'

    AtsIntegrationPatch:
      type: object
      properties:
        patch:
          type: object
          properties:
            $set:
              type: object
              properties:
                integrationName:
                  type: string
                  example: "Customer Name - LinkedIn LTS Premium Job Posting Integration"

    AtsIntegrationResponse:
      type: object
      description: Response for ATS integration details
      properties:
        results:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/AtsIntegrationDetail'

    AtsIntegrationDetail:
      type: object
      properties:
        integrationContext:
          type: string
          example: "urn:li:contract:12345"
        integrationType:
          type: string
          example: "PREMIUM_JOB_POSTING"
        integrationName:
          type: string
          example: "Customer Name - LinkedIn LTS Premium Job Posting Integration"
        status:
          type: string
          example: "ENABLED"

    ErrorResponse:
      type: object
      properties:
        status:
          type: integer
          example: 400
        message:
          type: string
          example: "Invalid request parameters"
        serviceErrorCode:
          type: integer
          example: 100

  examples:
    SimpleJobPostingRequestExample:
      summary: Example Apply Connect job posting request
      value:
        elements:
        - externalJobPostingId: "JOB-2024-001"
          title: "Software Developer in Test"
          description: "We are looking for a talented Software Developer in Test to join our engineering team. You will be responsible for designing and implementing automated tests."
          integrationContext: "urn:li:organization:12345678"
          jobPostingOperationType: "CREATE"
          listingType: "BASIC"
          listedAt: 1702693664000
          location: "San Francisco, CA"
          companyApplyUrl: "https://company.com/careers/apply"
          onsiteApplyConfiguration:
            jobApplicationWebhookUrl: "https://ats.company.com/webhooks/linkedin"
            questions:
              resumeQuestions:
                resumeQuestionRequirement: "REQUIRED"
              coverLetterQuestions:
                coverLetterQuestionRequirement: "OPTIONAL"

    CloseJobPostingRequestExample:
      summary: Example request to close a job posting
      value:
        elements:
        - externalJobPostingId: "JOB-2024-001"
          title: "Software Developer in Test"
          description: "Position has been filled."
          integrationContext: "urn:li:organization:12345678"
          jobPostingOperationType: "CLOSE"
          listingType: "BASIC"
          listedAt: 1702693664000
          location: "San Francisco, CA"

    JobPostingResponseExample:
      summary: Example job posting response
      value:
        elements:
        - status: "ACCEPTED"
          taskUrn: "urn:li:simpleJobPostingTask:12345678"

    JobPostingTaskResponseExample:
      summary: Example job posting task status response
      value:
        results:
          "urn:li:simpleJobPostingTask:12345678":
            status: "SUCCEEDED"
            jobPostingUrn: "urn:li:jobPosting:2722131308"

    AtsIntegrationUpdateRequestExample:
      summary: Example ATS integration update request
      value:
        entities:
          "integrationContext=urn:li:contract:12345&integrationType=PREMIUM_JOB_POSTING&tenantType=JOBS&dataProvider=ATS":
            patch:
              $set:
                integrationName: "Customer Name - LinkedIn LTS Premium Job Posting Integration"

    AtsIntegrationResponseExample:
      summary: Example ATS integration response
      value:
        results:
          "integrationContext=urn:li:contract:12345&integrationType=PREMIUM_JOB_POSTING&tenantType=JOBS&dataProvider=ATS":
            integrationContext: "urn:li:contract:12345"
            integrationType: "PREMIUM_JOB_POSTING"
            integrationName: "Customer Name - LinkedIn LTS Premium Job Posting Integration"
            status: "ENABLED"

    ErrorResponseExample:
      summary: Example error response
      value:
        status: 400
        message: "Invalid request parameters"
        serviceErrorCode: 100

  parameters:
    RestliMethodHeader:
      name: x-restli-method
      in: header
      required: true
      description: Rest.li method for batch operations
      schema:
        type: string
      example: "batch_create"

    TaskIdsQuery:
      name: ids
      in: query
      required: true
      description: Task URN(s) to check status
      schema:
        type: string
      example: "urn:li:simpleJobPostingTask:12345678"

    IntegrationContextQuery:
      name: ids[0].integrationContext
      in: query
      required: true
      description: Integration context URN
      schema:
        type: string
      example: "urn:li:contract:12345"

    IntegrationTypeQuery:
      name: ids[0].integrationType
      in: query
      required: true
      description: Type of integration
      schema:
        type: string
      example: "PREMIUM_JOB_POSTING"

    TenantTypeQuery:
      name: ids[0].tenantType
      in: query
      required: true
      description: Tenant type for the integration
      schema:
        type: string
      example: "JOBS"

    DataProviderQuery:
      name: ids[0].dataProvider
      in: query
      required: true
      description: Data provider identifier
      schema:
        type: string
      example: "ATS"

security:
- OAuth2Auth: []

paths:
  /v2/simpleJobPostings:
    post:
      operationId: createOrUpdateJobPosting
      tags:
      - Apply Connect Jobs
      summary: LinkedIn Create or Update Apply Connect Job Posting
      description: >-
        Creates a new Apply Connect enabled job posting or updates/closes an existing one.
        Use the `jobPostingOperationType` field to specify the operation:

        - `CREATE`: Create a new job posting
        - `UPDATE`: Update an existing job posting
        - `CLOSE`: Close an existing job posting

        For more information, refer to the
        [Apply Connect Jobs Lifecycle documentation](https://docs.microsoft.com/en-us/linkedin/talent/job-postings/api/sync-jobs-onsite-apply#apply-connect-jobs-lifecycle).
      x-microcks-operation:
        dispatcher: FALLBACK
        dispatcherRules: |
          {
            "dispatcher": "FALLBACK",
            "dispatcherRules": ""
          }
        delay: 100
      parameters:
      - $ref: '#/components/parameters/RestliMethodHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimpleJobPostingRequest'
            examples:
              CreateJobPosting:
                $ref: '#/components/examples/SimpleJobPostingRequestExample'
              CloseJobPosting:
                $ref: '#/components/examples/CloseJobPostingRequestExample'
      responses:
        '200':
          description: Job posting request accepted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobPostingResponse'
              examples:
                SuccessResponse:
                  $ref: '#/components/examples/JobPostingResponseExample'
        '400':
          description: Bad request - invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                BadRequestError:
                  $ref: '#/components/examples/ErrorResponseExample'
        '401':
          description: Unauthorized - invalid or missing authentication
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /v2/simpleJobPostingTasks:
    get:
      operationId: getJobPostingTaskStatus
      tags:
      - Job Lifecycle Management
      summary: LinkedIn Check Job Posting Task Status
      description: >-
        Retrieves the status of a job posting task to track whether the job has been
        successfully created, updated, or closed.

        After successful completion, the response includes the `jobPostingUrn` which
        can be used to view the job at: `https://www.linkedin.com/jobs/view/{jobPostingId}`

        For more information, refer to the
        [Check Job Task Status documentation](https://docs.microsoft.com/en-us/linkedin/talent/job-postings/api/check-job-taskstatus).
      x-microcks-operation:
        dispatcher: FALLBACK
        dispatcherRules: |
          {
            "dispatcher": "FALLBACK",
            "dispatcherRules": ""
          }
        delay: 100
      parameters:
      - $ref: '#/components/parameters/TaskIdsQuery'
      responses:
        '200':
          description: Successfully retrieved task status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobPostingTaskResponse'
              examples:
                SuccessResponse:
                  $ref: '#/components/examples/JobPostingTaskResponseExample'
        '400':
          description: Bad request - invalid task URN
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized - invalid or missing authentication
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Task not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /v2/atsIntegrations:
    post:
      operationId: updateCustomerIntegrations
      tags:
      - Customer Integrations
      summary: LinkedIn Update Customer ATS Integrations
      description: >-
        Updates customer ATS integrations for premium job posting capabilities.
        Partners use this endpoint to configure the integration name and other
        settings for their customers.
      x-microcks-operation:
        dispatcher: FALLBACK
        dispatcherRules: |
          {
            "dispatcher": "FALLBACK",
            "dispatcherRules": ""
          }
        delay: 100
      parameters:
      - $ref: '#/components/parameters/IntegrationContextQuery'
      - $ref: '#/components/parameters/IntegrationTypeQuery'
      - $ref: '#/components/parameters/TenantTypeQuery'
      - $ref: '#/components/parameters/DataProviderQuery'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AtsIntegrationUpdateRequest'
            examples:
              UpdateIntegration:
                $ref: '#/components/examples/AtsIntegrationUpdateRequestExample'
      responses:
        '200':
          description: Successfully updated the integration
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AtsIntegrationResponse'
              examples:
                SuccessResponse:
                  $ref: '#/components/examples/AtsIntegrationResponseExample'
        '400':
          description: Bad request - invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized - invalid or missing authentication
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

    get:
      operationId: getCustomerIntegrations
      tags:
      - Customer Integrations
      summary: LinkedIn Get Customer ATS Integration Details
      description: >-
        Retrieves the details of a customer's ATS integration for premium job posting.
        Use this endpoint to verify integration configuration and status.
      x-microcks-operation:
        dispatcher: FALLBACK
        dispatcherRules: |
          {
            "dispatcher": "FALLBACK",
            "dispatcherRules": ""
          }
        delay: 100
      parameters:
      - $ref: '#/components/parameters/IntegrationContextQuery'
      - $ref: '#/components/parameters/IntegrationTypeQuery'
      - $ref: '#/components/parameters/TenantTypeQuery'
      - $ref: '#/components/parameters/DataProviderQuery'
      responses:
        '200':
          description: Successfully retrieved integration details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AtsIntegrationResponse'
              examples:
                SuccessResponse:
                  $ref: '#/components/examples/AtsIntegrationResponseExample'
        '400':
          description: Bad request - invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized - invalid or missing authentication
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Integration not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'