---
title: "Update a monitor: name, interval, webhook_url (empty string removes it), active, and the saved search (endpoint, q and search options; a changed search starts a new baseline)"
method: PATCH
path: "/v1/monitors/{id}"
---

# Update a monitor: name, interval, webhook_url (empty string removes it), active, and the saved search (endpoint, q and search options; a changed search starts a new baseline)

`PATCH /v1/monitors/{id}`

## Request

- Base URL: `https://api.serpkite.com`
- URL: `https://api.serpkite.com/v1/monitors/{id}`
- Auth: HTTP bearer

## Request body

- MonitorUpdateRequest: Only the fields sent change. Search fields are merged into the saved search; a changed search (or endpoint) makes the next run report every result as new.
  - `name` string
  - `interval` 'hourly' | 'daily' | 'weekly'
  - `interval_seconds` integer
  - `webhook_url` string: A webhook URL, or an empty string to remove it
  - `active` boolean: true resumes a paused monitor (due now, failure streak cleared)
  - `metadata` object, nullable: Replaces the metadata (null clears it)
  - `endpoint` 'search' | 'news' | 'webpage': Switching between a search and a page drops the other kind's fields
  - `q` string
  - `url` string, uri: endpoint=webpage only
  - `country` string
  - `language` string
  - `location` string
  - `time` 'hour' | 'day' | 'week' | 'month' | 'year'
  - `num` integer
  - `device` 'desktop' | 'mobile'
  - `safe` 'active' | 'off'
  - `include_domains` union: Domains as an array or a comma-separated string, at most 20: a host (`example.com`, subdomains match), a host with a path prefix (`github.com/org`) or a TLD (`.gov`).
    - string
    - string[]
  - `exclude_domains` union: Domains as an array or a comma-separated string, at most 20: a host (`example.com`, subdomains match), a host with a path prefix (`github.com/org`) or a TLD (`.gov`).
    - string
    - string[]
  - `engine` union: Which search providers may answer. `google` (the default) is Google only; within Google, SerpKite always fails over across its own proxy pools. `auto` allows falling back to other enabled providers, in route order, when Google is blocked or times out. A single other provider (`brave`) or a list (`["google","brave"]`, or `google,brave` in a query string) restricts the request to those providers. `meta.engine` always names the provider that answered and credits follow that provider's price. A key with "Allow fallback to other search engines" on treats a request without `engine` as `auto`. `consensus` (`/v1/search` only; 400 elsewhere, and it can't be combined with other names) queries several independent search indexes in parallel (at most one Bing-backed provider, so Yahoo or DuckDuckGo never count as agreeing with Bing), merges the results by URL and ranks them by how many providers returned each one. Each result lists its `sources`; `meta.engine` is `consensus` and `meta.route` lists every provider attempt. It stops once `num` unique results are in hand or after a few seconds, and costs the sum of one page at each provider that returned results (providers that failed, came back empty or were never started are free).
    - string
    - Provider[]

## Response `200`

OK

- Monitor
  - `id` string, uuid, required
  - `name` string, required
  - `endpoint` 'search' | 'news' | 'webpage', required
  - `request` MonitorSearch, required: The saved request a monitor reruns: a search (q and options) or, for webpage monitors, url (and country)
    - `q` string
    - `url` string
    - `country` string
    - `language` string
    - `location` string
    - `time` 'hour' | 'day' | 'week' | 'month' | 'year'
    - `num` integer
    - `device` string
    - `safe` string
    - `include_domains` string[]
    - `exclude_domains` string[]
    - `engine` string[]
  - `metadata` object, nullable
  - `interval_seconds` integer, required
  - `webhook_url` string, nullable, required: Null when new results are only kept in the run history
  - `active` boolean, required
  - `next_run_at` string, date-time, required
  - `last_run_at` string, date-time, nullable
  - `last_status` 'ok' | 'error' | 'webhook_failed' | 'paused' | 'null', nullable
  - `last_error` string, nullable
  - `last_new_results` integer: New results found by the last run
  - `runs` integer, required
  - `consecutive_failures` integer, required: Failed runs in a row; the monitor pauses itself at 10
  - `credits_used` number, required: Total over all runs
  - `created_at` string, date-time, required

## Other responses

- `400`: Error
- `401`: Error
- `404`: Error
- `429`: Error

---

[API](https://skmtc.dev/serpkite/apis/serpkite-serp-api.md) · [All operations](https://skmtc.dev/serpkite/apis/serpkite-serp-api/llms.txt) · [OpenAPI document](https://skmtc.dev/serpkite/apis/serpkite-serp-api/revisions/f2c6dd05cfc5?raw)
