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

# Update a job-change monitor

> Rename a monitor, change its frequency, pause or resume checks, change its webhook, or rotate the signing secret. 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.

Update one or more monitor fields with `PATCH`. The body accepts `name`, `frequency`, `action` (`pause` or `resume`), `webhook_url`, and `rotate_signing_secret: true`, and they can be combined in one request, for example `{"name": "CRM champions (Q4)", "action": "pause"}`.

The response returns the complete updated monitor, including its active profile and unread event counts.

## Pause and resume

Pausing stops future checks and clears `next_check_at`. Resuming requires at least one active profile and reruns monitoring admission, including the credit check for the next full check; an empty monitor returns `422 no_active_profiles` and a workspace that cannot pay returns `402 insufficient_credits`.

A resumed monitor that has never completed a check is due immediately. Otherwise its next check is one period after the last completed check, or immediately if that time has already passed.

## Change the frequency

Changing the frequency of an active monitor reschedules the next check from its last completed check, never earlier than now. A monitor that has not completed a check keeps its pending first check, and a paused monitor stays paused until resumed. Recurring checks are anchored on the time the previous check became due, so long checks do not shift the schedule. Renaming a monitor also renames its results table while the table still has its generated `<name> — Job changes` title.

## Change the webhook or recover a lost signing secret

`webhook_url` accepts a public HTTPS URL without embedded credentials, or `null`. Invalid URLs return `422 invalid_monitor_update`. These fields work independently of name, frequency, and pause or resume.

* Setting or changing the URL generates a fresh signing secret.
* `{"rotate_signing_secret": true}` alone rotates the secret of the current webhook. Rotating without an enabled webhook returns `422 webhook_not_configured`; combining rotation with `webhook_url: null` returns `422 invalid_monitor_update`.
* `{"webhook_url": null}` disables the webhook and clears its stored secret.
* Setting the same URL without rotation keeps the existing secret and returns no secret.

When a new secret is generated, the response includes `signing_secret` and `signing_secret_warning`. Store the secret immediately; list and get never return it. If the response is lost, rotate again and install the newest secret.

Changing the URL, disabling, or rotating cancels pending and retryable deliveries made with the previous configuration (`error_code: "webhook_configuration_changed"`); delivered and failed receipts stay visible. When a send is in flight, the request returns `409 webhook_delivery_in_progress` without changing anything. Wait for the delivery to settle, retry the edit, and make your receiver accept the new secret after rotation.

Webhook changes keep the monitor ID, baselines, history, results table, and schedule. They do not check profiles or spend credits.

## Next step

Use [Add profiles](https://docs.airscale.io/api-reference/job-change-monitors/profiles/add.md) before resuming a monitor with no active profiles.


## OpenAPI

````yaml openapi.json PATCH /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}:
    patch:
      tags:
        - Job change monitoring
      summary: Update, pause, or resume a monitor, or change its webhook
      description: >-
        Changes the name or frequency, pauses or resumes checks, sets, changes,
        or disables the webhook, or rotates the signing secret. Fields can be
        combined in one request. Resuming requires at least one active profile
        and reruns monitoring admission. Setting a new webhook URL or rotating
        returns a one-time signing_secret. Requires a V2 workspace API key. V1
        (Bubble) API keys are not supported. Monitors and monitoring credits
        belong to the V2 workspace.
      operationId: updateJobChangeMonitor
      parameters:
        - name: monitor_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: 11111111-1111-4111-8111-111111111111
      requestBody:
        required: true
        description: >-
          Send at least one of name, frequency, action, webhook_url, or
          rotate_signing_secret.
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              minProperties: 1
              properties:
                name:
                  type: string
                  minLength: 1
                  maxLength: 120
                frequency:
                  type: string
                  enum:
                    - weekly
                    - every_30_days
                    - every_90_days
                action:
                  type: string
                  enum:
                    - pause
                    - resume
                webhook_url:
                  type:
                    - string
                    - 'null'
                  format: uri
                  maxLength: 2048
                  description: >-
                    Set or change the webhook (a public HTTPS URL without
                    embedded credentials), or send null to disable it and clear
                    its signing secret. Setting a new URL returns a fresh
                    signing_secret.
                rotate_signing_secret:
                  type: boolean
                  const: true
                  description: >-
                    Generate a new signing secret for the enabled webhook.
                    Cannot be combined with webhook_url: null.
            examples:
              frequency:
                summary: Change the check frequency
                value:
                  frequency: every_90_days
              pause:
                summary: Rename and pause checks
                value:
                  name: CRM champions (Q4)
                  action: pause
              resume:
                summary: Resume checks
                value:
                  action: resume
              webhook:
                summary: Set a webhook and get a new signing secret
                value:
                  webhook_url: https://hooks.example.com/airscale/job-changes
                  rotate_signing_secret: true
              rotate:
                summary: Rotate the signing secret
                value:
                  rotate_signing_secret: true
              disableWebhook:
                summary: Disable the webhook
                value:
                  webhook_url: null
      responses:
        '200':
          description: >-
            The updated monitor. signing_secret and signing_secret_warning
            appear only when a new secret was generated.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - monitor
                properties:
                  monitor:
                    $ref: '#/components/schemas/JobChangeMonitor'
                  signing_secret:
                    type: string
                    description: >-
                      Present only when the request set a new webhook URL or
                      rotated the secret. Store it immediately.
                  signing_secret_warning:
                    type: string
              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
                    signing_secret: example-signing-secret
                    signing_secret_warning: Store this secret now. It is not returned again.
        '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: resuming requires the workspace to pay for the
            next full check.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '404':
          description: monitor_not_found in this workspace.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '409':
          description: >-
            webhook_delivery_in_progress: a webhook send is in flight. The
            configuration was not changed; retry after the delivery settles.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobChangeError'
        '422':
          description: >-
            invalid_monitor_update (for example no supported field, an unknown
            field, a webhook_url that is not a public HTTPS destination, or
            rotation combined with webhook_url: null), webhook_not_configured
            when rotating without a webhook, or no_active_profiles when resuming
            an empty monitor.
          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
    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.