> ## 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.

# Get a job-change monitor

> Retrieve one monitor, its profiles, and its latest events. 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.

Retrieve one monitor by `monitor_id`. The response contains all profiles, including soft-removed profiles, and up to the latest 200 events ordered newest first.

> [!NOTE]
>
> Use the profile `status` and `removed_at` fields to distinguish an active profile from one removed from future checks. Profile `status` is `pending`, `baseline`, `checked`, `unavailable`, `failed`, or `removed`. Historical events remain available after a profile is removed.

The monitor object reports `next_check_at` and `last_successful_check_at` as ISO 8601 timestamps. A paused monitor has no next check scheduled. When a check could not start or stopped early, `run_block_reason` (for example `insufficient_credits`) and `run_block_detail` explain why; they clear when a later check starts. `results_table_id`, `results_status` and `results_error` describe the results table that receives one row per new event.

A monitor can contain up to 10,000 active profiles under the same schedule and webhook. Checks run asynchronously and large checks can take time. Internally, profiles are processed in batches with durable progress, so a retried check keeps its billing identity and does not charge a profile twice. Profiles added after a check starts join the next check. A profile's first successful check establishes its baseline without emitting a job-change event.

## Next step

Use [List job-change events](https://docs.airscale.io/api-reference/job-change-monitors/events.md) when you need cursor pagination beyond the latest 200 events or webhook delivery receipts.


## OpenAPI

````yaml openapi.json GET /v1/job-change-monitors/{monitor_id}
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}:
    get:
      tags:
        - Job change monitoring
      summary: Get a monitor with profiles and recent events
      description: >-
        Returns one monitor, all of its profiles (including removed profiles),
        and up to the latest 200 events ordered newest first. Requires a V2
        workspace API key. V1 (Bubble) API keys are not supported. Monitors and
        monitoring credits belong to the V2 workspace.
      operationId: getJobChangeMonitor
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: 11111111-1111-4111-8111-111111111111
      responses:
        '200':
          description: The monitor detail.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - monitor
                  - profiles
                  - events
                properties:
                  monitor:
                    $ref: '#/components/schemas/JobChangeMonitor'
                  profiles:
                    type: array
                    items:
                      $ref: '#/components/schemas/JobChangeProfile'
                  events:
                    type: array
                    items:
                      $ref: '#/components/schemas/JobChangeEvent'
              examples:
                success:
                  summary: Successful response
                  value:
                    monitor:
                      id: 11111111-1111-4111-8111-111111111111
                      name: CRM champions
                      frequency: every_30_days
                      status: active
                      results_table_id: 44444444-4444-4444-8444-444444444444
                      results_status: ready
                      results_error: null
                      next_check_at: '2026-11-02T10:00:00.000Z'
                      last_successful_check_at: null
                      created_at: '2026-11-02T10:00:00.000Z'
                      updated_at: '2026-11-02T10:00:00.000Z'
                      webhook_url: https://hooks.example.com/airscale/job-changes
                      webhook_configured: true
                      run_block_reason: null
                      run_block_detail: null
                      active_profile_count: 1
                      unread_event_count: 0
                    profiles:
                      - id: 22222222-2222-4222-8222-222222222222
                        linkedin_url: https://www.linkedin.com/in/example-person
                        external_id: crm-contact-123
                        status: pending
                        removed_at: null
                    events:
                      - id: 33333333-3333-4333-8333-333333333333
                        monitor_id: 11111111-1111-4111-8111-111111111111
                        profile_id: 22222222-2222-4222-8222-222222222222
                        linkedin_url: https://www.linkedin.com/in/example-person
                        external_id: crm-contact-123
                        previous_employer:
                          identity: example-old-company
                          name: Example Old Company
                        new_employer:
                          identity: example-new-company
                          name: Example New Company
                        detected_at: '2026-12-02T10:00:00.000Z'
                        read_at: null
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: monitor_not_found in this workspace.
          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:
    JobChangeMonitor:
      type: object
      additionalProperties: false
      required:
        - id
        - name
        - frequency
        - status
        - results_table_id
        - results_status
        - results_error
        - next_check_at
        - last_successful_check_at
        - created_at
        - updated_at
        - webhook_url
        - webhook_configured
        - run_block_reason
        - run_block_detail
        - active_profile_count
        - unread_event_count
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        frequency:
          type: string
          enum:
            - weekly
            - every_30_days
            - every_90_days
        status:
          type: string
          enum:
            - active
            - paused
            - running
            - setup_failed
        results_table_id:
          type:
            - string
            - 'null'
          description: >-
            The Airscale results table that receives one row per new job-change
            event. Null until the table exists.
        results_status:
          type: string
          enum:
            - pending
            - ready
            - blocked
          description: >-
            Whether the results table can receive rows. blocked means the table
            was deleted or is full; new rows stay pending.
        results_error:
          type:
            - string
            - 'null'
          description: Why results delivery is blocked, or null.
        next_check_at:
          type:
            - string
            - 'null'
          format: date-time
        last_successful_check_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        webhook_url:
          type:
            - string
            - 'null'
          format: uri
        webhook_configured:
          type: boolean
        run_block_reason:
          type:
            - string
            - 'null'
          description: >-
            Why the latest check could not start or stopped early, for example
            insufficient_credits. Null when no block is active.
        run_block_detail:
          type:
            - object
            - 'null'
          additionalProperties: true
          description: >-
            Details for run_block_reason, such as stage, credits_needed and
            credits_available, or the checked and skipped counts of a run that
            stopped early.
        active_profile_count:
          type: integer
          minimum: 0
          maximum: 10000
        unread_event_count:
          type: integer
          minimum: 0
    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
    JobChangeEvent:
      type: object
      additionalProperties: false
      required:
        - id
        - monitor_id
        - profile_id
        - linkedin_url
        - external_id
        - previous_employer
        - new_employer
        - detected_at
        - read_at
      properties:
        id:
          type: string
          format: uuid
        monitor_id:
          type: string
          format: uuid
        profile_id:
          type: string
          format: uuid
        linkedin_url:
          type: string
          format: uri
        external_id:
          type:
            - string
            - 'null'
        previous_employer:
          $ref: '#/components/schemas/JobChangeEmployer'
        new_employer:
          type: object
          additionalProperties: false
          required:
            - identity
            - name
          properties:
            identity:
              type: string
            name:
              type:
                - string
                - 'null'
        detected_at:
          type: string
          format: date-time
        read_at:
          type:
            - string
            - 'null'
          format: date-time
    JobChangeError:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
    Error:
      type: object
      additionalProperties: true
      properties:
        error:
          type: string
        message:
          type: string
    JobChangeEmployer:
      type: object
      additionalProperties: false
      required:
        - identity
        - name
      properties:
        identity:
          type:
            - string
            - 'null'
        name:
          type:
            - string
            - 'null'
  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.