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

# Add profiles to a job-change monitor

> Add up to 10,000 personal LinkedIn profiles per request while preserving existing baselines. Rate limit: 120 requests per fixed minute per API key, shared by all job-change monitor endpoints.

> [!NOTE]
>
> Job-change monitoring requires a **V2 workspace API key**. V1 (Bubble) API keys are not supported by these endpoints. Monitors and monitoring credits belong to the V2 workspace associated with the key.

Add one to 10,000 personal LinkedIn profiles per request to an existing monitor. Airscale ignores a URL that is already active in the same monitor and reports how many profiles were actually added. All profiles keep the existing monitor ID, frequency, and webhook.

> [!NOTE]
>
> Adding a URL after it was removed creates a new profile and a new baseline. The previous profile's events remain associated with its original profile ID.

The `201` response includes the profile records, `added_profile_count`, the monitor's resulting `active_profile_count`, `duplicates`, and `skipped_duplicate_count`. `duplicates` lists profiles that another monitor in the workspace already watches; each monitor checks and charges them separately. Send `"skip_duplicates": true` to leave them out. A request whose every profile is a duplicate returns `422 all_profiles_duplicated`.

The 10,000-profile limit applies to the monitor's active profiles after adding new URLs; exceeding it returns `422 profile_limit_reached`. For example, a monitor with 9,000 active profiles can accept 1,000 more distinct active profiles.

The complete JSON request body must fit within **8 MiB (8,388,608 bytes)** in UTF-8; larger bodies return `413`. Split a larger payload into smaller add requests to the same monitor, keeping its total at or below 10,000 active profiles.

Checks run asynchronously. Profiles added while a check is running join the next check. A new profile's first successful check establishes its baseline without emitting a job-change event. Monitoring costs **0.1 credit per profile per check**, using the monitor's weekly, every-30-days, or every-90-days schedule.

## Next step

Use [Get a monitor](https://docs.airscale.io/api-reference/job-change-monitors/get.md) to inspect each profile's baseline and check status.


## OpenAPI

````yaml openapi.json POST /v1/job-change-monitors/{monitor_id}/profiles
openapi: 3.1.0
info:
  title: Airscale Public API
  version: '2026-09-11'
  description: >-
    Search, enrich, resolve public business data, and monitor job changes with
    Airscale.
  x-airscale-source-repository: ViceScale/airscale-code
  x-airscale-source-sha: 1de19e1b70a052a4b8d9c2075021a7e5e7a94d51
servers:
  - url: https://api.airscale.io
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Search and discovery
    description: Search people, companies, and the web.
  - name: Contact data
    description: Find professional and personal contact data.
  - name: Profiles and reverse lookup
    description: Extract profiles or resolve a person from known contact data.
  - name: Post engagement
    description: Retrieve and enrich people who liked or commented on LinkedIn posts.
  - name: LinkedIn content
    description: >-
      Search LinkedIn posts, read profile and company feeds, and retrieve
      profile comments and comment reactions.
  - name: Job change monitoring
    description: Track LinkedIn profiles and receive job-change events.
  - name: Account
    description: Inspect workspace account state.
  - name: Miscellaneous
    description: >-
      Find website technologies and check WhatsApp availability, Meta ads, and
      email deliverability.
paths:
  /v1/job-change-monitors/{monitor_id}/profiles:
    post:
      tags:
        - Job change monitoring
      summary: Add profiles to a monitor
      description: >-
        Adds 1–10,000 personal LinkedIn profiles per request to an existing
        monitor, up to 10,000 active profiles in total. The monitor keeps the
        same ID, frequency, and webhook. An already-active URL is ignored;
        adding it after removal creates a new profile and baseline. Checks run
        asynchronously and profiles added while a check is running join the next
        check. Requires a V2 workspace API key. V1 (Bubble) API keys are not
        supported. Monitors and monitoring credits belong to the V2 workspace.
      operationId: addJobChangeMonitorProfiles
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: 11111111-1111-4111-8111-111111111111
      requestBody:
        required: true
        description: >-
          Provide 1–10,000 personal LinkedIn profiles in a JSON body of at most
          8 MiB (8,388,608 bytes), without exceeding 10,000 active profiles in
          the monitor. Split larger payloads into smaller requests to the same
          monitor.
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
                - profiles
              properties:
                skip_duplicates:
                  type: boolean
                  default: false
                  description: >-
                    Leave out profiles that another monitor in this workspace
                    already watches. Without it, duplicates are added and
                    reported in duplicates.
                profiles:
                  type: array
                  minItems: 1
                  maxItems: 10000
                  items:
                    type: object
                    additionalProperties: false
                    required:
                      - linkedin_url
                    properties:
                      linkedin_url:
                        type: string
                        format: uri
                        minLength: 1
                        maxLength: 512
                        description: >-
                          A personal LinkedIn profile URL. Airscale
                          canonicalizes it to
                          https://www.linkedin.com/in/{slug}.
                      external_id:
                        type: string
                        minLength: 1
                        maxLength: 200
                        description: >-
                          Your CRM or application identifier. It is echoed in
                          profile records and job-change events.
            examples:
              profiles:
                summary: Add one synthetic profile
                value:
                  profiles:
                    - linkedin_url: https://www.linkedin.com/in/example-person
                      external_id: crm-contact-456
      responses:
        '201':
          description: The profiles accepted for the monitor.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - profiles
                  - added_profile_count
                  - active_profile_count
                  - duplicates
                  - skipped_duplicate_count
                properties:
                  profiles:
                    type: array
                    items:
                      $ref: '#/components/schemas/JobChangeProfile'
                  added_profile_count:
                    type: integer
                    minimum: 0
                  active_profile_count:
                    type: integer
                    minimum: 0
                    maximum: 10000
                  duplicates:
                    type: array
                    items:
                      $ref: '#/components/schemas/JobChangeDuplicate'
                    description: >-
                      Profiles that another monitor in this workspace already
                      watches. Each monitor checks and charges its profiles
                      separately.
                  skipped_duplicate_count:
                    type: integer
                    minimum: 0
              examples:
                success:
                  summary: Successful response
                  value:
                    profiles:
                      - id: 55555555-5555-4555-8555-555555555555
                        linkedin_url: https://www.linkedin.com/in/example-person
                        external_id: crm-contact-456
                        status: pending
                        removed_at: null
                    added_profile_count: 1
                    active_profile_count: 2
                    duplicates: []
                    skipped_duplicate_count: 0
        '400':
          description: >-
            The request body is missing or is not valid JSON. The public API
            returns {"error":"Invalid JSON"}.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          description: >-
            insufficient_credits: the workspace cannot pay for the next full
            check of the monitor's active profiles.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '404':
          description: monitor_not_found in this workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '413':
          description: The JSON request body exceeds the 8 MiB (8,388,608 bytes) limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            invalid_profiles (for example an invalid LinkedIn URL or duplicate
            URLs in the request), profile_limit_reached when the monitor would
            exceed 10,000 active profiles, or all_profiles_duplicated when
            skip_duplicates leaves no profiles.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '429':
          description: >-
            The API key has exceeded 120 requests in the current minute across
            job-change monitor endpoints. Wait for the Retry-After seconds
            before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: string
              example: '60'
        '503':
          description: Job change monitoring is temporarily unavailable or not enabled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
components:
  schemas:
    JobChangeProfile:
      type: object
      additionalProperties: false
      required:
        - id
        - linkedin_url
        - external_id
        - status
        - removed_at
      properties:
        id:
          type: string
          format: uuid
        linkedin_url:
          type: string
          format: uri
        external_id:
          type:
            - string
            - 'null'
        status:
          type: string
          enum:
            - pending
            - baseline
            - checked
            - unavailable
            - failed
            - removed
        removed_at:
          type:
            - string
            - 'null'
          format: date-time
    JobChangeDuplicate:
      type: object
      additionalProperties: false
      required:
        - linkedin_url
        - monitor_id
        - monitor_name
      properties:
        linkedin_url:
          type: string
          format: uri
        monitor_id:
          type: string
          format: uuid
        monitor_name:
          type: string
    Error:
      type: object
      additionalProperties: true
      properties:
        error:
          type: string
        message:
          type: string
    JobChangeError:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
  responses:
    Unauthorized:
      description: The Bearer token is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Use an Airscale workspace API key. Never expose the key in client-side
        code.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.