Skip to content

Edit site settings

PATCH
/v1/sites/{id}
curl --request PATCH \
--url https://api.overwatch.weareheavy.dev/v1/sites/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Content-Type: application/json' \
--header 'x-api-key: <x-api-key>' \
--data '{ "cadenceMinutes": 1440, "a11yEnabled": true, "excludePaths": [ "/drafts/*", "/preview/*" ], "stripParams": [ "utm_source", "utm_campaign" ] }'

Edit a site’s settings, including its app toggles. Requires an owner/admin session or an API key with access to the site.

A cadenceMinutes change reschedules the next run from the last run, so the new frequency takes effect without waiting out the old cycle. Daily (1440) is the floor for both crawl and a11y cadences; sites created before the floor keep their current cadence but can’t go more frequent. maxPages and maxConcurrency are not editable here — they are operator-managed limits.

The crawl is shared infrastructure for the Broken Links and Accessibility apps: it is unscheduled only when both are off, and turning the first one on reschedules it (immediately if the site never ran). Toggling the Uptime app stops or resumes all the site’s monitors at once without touching per-monitor pause state. Changing excludePaths recomputes the stored accessibility score immediately.

id
required
string format: uuid

The site’s UUID.

Media typeapplication/json

All fields optional; omitted fields keep their current value.

object
rootUrl

New root URL (http(s) only). Changes the crawl boundary.

string format: uri
cadenceMinutes

New re-crawl cadence in minutes. Reschedules the next run from the last run so the new frequency takes effect immediately. Daily (1440) is the floor; a site created below it may keep (or slow) its cadence but can’t go more frequent.

integer
>= 1
scannerEnabled

Toggle the Broken Links app.

boolean
a11yEnabled

Toggle the Accessibility app.

boolean
seoEnabled

Toggle the SEO app.

boolean
a11yCadenceMinutes

The accessibility scan’s own cadence, in minutes (daily floor, same grandfathering as cadenceMinutes). Newly enabling the app with no stored cadence defaults it to monthly.

integer
>= 1
performanceEnabled

Toggle the Performance app.

boolean
uptimeEnabled

Toggle the Uptime app. Turning it off stops probing all the site’s monitors immediately (they and their history remain); turning it back on resumes the previously enabled ones.

boolean
excludePaths

Glob patterns for internal paths the crawler must never enqueue (e.g. /drafts/*), applied on top of robots.txt. Max 200.

Array<string>
<= 200 items
stripParams

Query-parameter names dropped from URLs before they enter the crawl frontier (e.g. tracking parameters), so the same page isn’t crawled once per parameter value. Max 200.

Array<string>
<= 200 items
Example
{
"cadenceMinutes": 1440,
"a11yEnabled": true,
"excludePaths": [
"/drafts/*",
"/preview/*"
],
"stripParams": [
"utm_source",
"utm_campaign"
]
}

The updated site.

Media typeapplication/json
object
site
required

A monitored site, including its per-app toggles.

object
id
required
string format: uuid
tenant_id
required

The owning organization (tenant) id.

string
hostname
required

The hostname derived from root_url; the crawl whitelist.

string
root_url
required
string format: uri
cadence_minutes
required
integer
max_pages
required
integer
max_concurrency
required
integer
enabled
required

1 if the site is actively scheduled, 0 if disabled.

integer
Allowed values: 0 1
last_run_at
required

Epoch ms of the last run, or null.

integer | null
next_run_at
required

Epoch ms of the next scheduled run, or null.

integer | null
created_at
required

Epoch ms the site was registered.

integer
scanner_enabled
required

1 when the Broken Links app is installed. The shared crawl runs when any of it, the Accessibility app, or the SEO app is on.

integer
Allowed values: 0 1
a11y_enabled
required

1 when the Accessibility app is installed.

integer
Allowed values: 0 1
a11y_cadence_minutes
required

The accessibility scan’s own cadence; null falls back to cadence_minutes.

integer | null
a11y_next_run_at
required

Epoch ms the next standalone accessibility scan is due, or null.

integer | null
performance_enabled
required

1 when the Performance app (CrUX sync + regression alerts) is installed.

integer
Allowed values: 0 1
uptime_enabled
required

1 when the Uptime app is installed; 0 stops probing but keeps monitors.

integer
Allowed values: 0 1
seo_enabled
required

1 when the SEO app is installed (on-page checks extracted during the crawl).

integer
Allowed values: 0 1
crux_status

CrUX sync state: null = never checked, ok = data, no-data = not in the dataset.

string | null
crux_checked_at

Epoch ms the CrUX sync last ran for this site.

integer | null
exclude_paths
required

JSON-encoded array of glob patterns for internal paths never crawled.

string
strip_params
required

JSON-encoded array of query-parameter names dropped before crawling.

string
Example
{
"site": {
"enabled": 0,
"scanner_enabled": 0,
"a11y_enabled": 0,
"performance_enabled": 0,
"uptime_enabled": 0,
"seo_enabled": 0,
"exclude_paths": "[\"/drafts/*\"]",
"strip_params": "[\"utm_source\"]"
}
}

Invalid rootUrl or cadenceMinutes.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "cadenceMinutes must be a positive integer"
}

Missing or invalid credentials.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "invalid api key"
}

The caller’s role or key scope does not allow this action.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "only owners and admins can edit site settings"
}

No site with that id is visible to the caller.

Media typeapplication/json
object
error
required

A human-readable error message.

string
Example
{
"error": "site not found"
}