/api/v1. Unless noted, requests require:
Authorization: Bearer {token}Accept: application/json- Verified user email
- Appropriate OAuth scope
Me
GET /me
Returns the authenticated user and all teams they belong to. Scope:teams:read
Response 200:
Teams
GET /teams
List teams for the authenticated user. Scope:teams:readTeam permission:
viewAny on teams
Response 200: { "data": [ Team, ... ] }
GET /teams/{team}
Show one team by numeric id. Scope:teams:readTeam permission:
view on team
Response 200: Team resource
GET /teams/{team}/monitoring
Read team monitoring defaults: enabled tools, cadences, status-check header, issue settings, quiet time, escalation, cadence presets, and UI helper metadata. Scope:teams:readTeam permission:
view team
Response 200:
PATCH /teams/{team}/monitoring
Update team monitoring defaults. Mirrors the dashboard Monitoring page (automatic checks, issue rules, escalation, and quiet time). Scope:teams:writeTeam permission:
updateMonitoring (admins and owners)Response
200: Same shape as GET /teams/{team}/monitoring
Body:
| Field | Required | Description |
|---|---|---|
monitoring_settings | yes | Full team monitoring settings object |
monitoring_settings.tools | yes | Map of tool value → tool settings |
monitoring_settings.tools.{tool}.enabled | yes | Whether the tool runs automatically and can open issues |
monitoring_settings.tools.{tool}.cadence_minutes | yes | Cadence preset in minutes |
monitoring_settings.tools.{tool}.settings | no | Tool-specific issue settings |
monitoring_settings.quiet_time | no | { "enabled", "starts_at", "ends_at" } in H:i format |
monitoring_settings.escalation | no | { "enabled", "intervals" } follow-up notification schedule |
DNS expected records are not writable through this endpoint. Use the dashboard or per-site
monitoring_settings.tools.dns.settings.expected_records on PATCH /sites/{site}.Updating cadences resyncs automatic schedules for all team sites.
Monitoring settings fields
The same nested shape is used for team monitoring updates and per-site overrides.| Field | Type | Limits | Description |
|---|---|---|---|
tools.status.enabled | boolean | — | Run Status automatically and allow status issues |
tools.status.cadence_minutes | integer | cadence preset | Automatic Status cadence |
tools.status.settings.header.name | string | null | valid HTTP header name | Header name sent with status checks |
tools.status.settings.header.value | string | null | max 2,000 chars, no newlines | Header value sent with status checks |
tools.status.settings.failures_to_open | integer | min 1 | Failed status checks before opening an issue |
tools.status.settings.successes_to_resolve | integer | min 1 | Successful checks before resolving |
tools.status.settings.confirmation_retry_minutes | integer | 1-5 | Confirmation retry delay |
tools.status.settings.incident_follow_up_minutes | integer | 1-60 | Active incident follow-up interval |
tools.ssl.enabled | boolean | — | Run SSL automatically and allow SSL issues |
tools.ssl.cadence_minutes | integer | cadence preset | Automatic SSL cadence |
tools.ssl.settings.expiry_days | integer | min 1 | Days before expiry to alert |
tools.ssl.settings.failures_to_open | integer | min 1 | Failed SSL checks before opening an issue |
tools.ssl.settings.confirmation_retry_minutes | integer | 1-5 | Confirmation retry delay |
tools.broken-links.enabled | boolean | — | Run Broken Links automatically and allow broken-link issues |
tools.broken-links.cadence_minutes | integer | cadence preset, 12-hour floor | Automatic Broken Links cadence |
tools.broken-links.settings.min_broken_count | integer | min 1 | Broken URLs to breach |
tools.broken-links.settings.consecutive_breaches_to_open | integer | min 1 | Consecutive breaches before opening |
tools.broken-links.settings.ignore_paths | string[] | max 255 chars each | Crawl exclusion path patterns |
tools.broken-links.settings.ignore_external_links | boolean | — | Exclude links outside the site host |
tools.broken-links.settings.ignore_redirects | boolean | — | Exclude redirect responses |
tools.performance.enabled | boolean | — | Run Performance automatically and allow performance issues |
tools.performance.cadence_minutes | integer | cadence preset, 12-hour floor | Automatic Performance cadence |
tools.performance.settings.url | string | null | same site domain | Page URL to audit instead of the site root |
tools.performance.settings.min_score | integer | 1-100 | Minimum performance score |
tools.performance.settings.max_response_time_ms | integer | null | min 1 | Legacy max response time, normalized with max_ttfb_ms |
tools.performance.settings.max_ttfb_ms | integer | null | min 1 | Max time to first byte |
tools.performance.settings.max_load_time_seconds | integer | null | min 1 | Max Time to Interactive |
tools.performance.settings.consecutive_breaches_to_open | integer | min 1 | Consecutive breaches before opening |
tools.dns.enabled | boolean | — | Run DNS automatically and allow DNS issues |
tools.dns.cadence_minutes | integer | cadence preset | Automatic DNS cadence |
tools.dns.settings.hard_failures_only | boolean | — | Open only on lookup failures when true |
tools.dns.settings.monitored_record_types | string[] | A, AAAA, CNAME, MX, NS, TXT | Record types to monitor for changes |
tools.dns.settings.expected_records | object | per-site only | Expected DNS records by type |
quiet_time.enabled | boolean | team only | Suppress outbound issue alerts during a daily window |
quiet_time.starts_at | string | H:i | Quiet time start |
quiet_time.ends_at | string | H:i, different from start | Quiet time end |
escalation.enabled | boolean | team only | Send reminders for active issues |
escalation.intervals | integer[] | 15, 30, 60, 360, 1440 | Reminder schedule in minutes |
snoozed_until | string | null | per-site only | Pause issue opening for one site until this datetime |
Sites
Team-scoped site management uses numeric{team} id. Individual site routes use {site} uuid.
GET /teams/{team}/sites
Paginated site list for a team. Includes latest check per tool. Scope:sites:readTeam permission:
viewAny sites
Query parameters:
| Parameter | Type | Description |
|---|---|---|
search | string | Filter by name or URL (partial match) |
pinned | boolean | true = pinned only; false = unpinned only |
tool | string | Sites with this tool enabled |
status | string | Sites with a check in this status (pending, completed, …) |
sort | string | created_at, -created_at, name, -name, pinned |
page | integer | Page number |
per_page | integer | Page size (max 100) |
200: Paginated Site collection
POST /teams/{team}/sites
Create a site. Scope:sites:writeTeam permission:
create siteResponse:
201 with Site resource
Body:
| Field | Required | Description |
|---|---|---|
url | yes | Valid HTTP(S) URL (normalized) |
name | no | Display name; generated from domain if omitted |
notes | no | Team notes |
js_rendered | no | Boolean; broken-link JS rendering |
monitoring_settings | no | Per-site monitoring overrides using the monitoring settings schema |
The API accepts omitted
name. The dashboard add-site form requires a display name and exposes detailed overrides on the site edit page after creation.POST /teams/{team}/sites/bulk
Create up to 100 sites in one request. Scope:sites:writeTeam permission:
create siteResponse
200: Bulk response
Body:
GET /sites/{site}
Show one site by uuid. Scope:sites:readTeam permission:
view site
Response 200: Site resource with latest_checks
PATCH /sites/{site}
Update a site. Sends the full site shape expected by the dashboard update form (includingurl).
Scope: sites:writeTeam permission:
update siteResponse
200: Updated Site resource
Body (all optional except url is required when sent):
| Field | Description |
|---|---|
url | Canonical URL. Required by the current validator. |
name | Display name |
notes | Notes |
pinned | Boolean pin state |
js_rendered | Broken-link JS mode |
monitoring_settings | Per-site monitoring overrides using the monitoring settings schema |
Updating enabled checks or cadences resyncs automatic schedules.
DELETE /sites/{site}
Delete a site and its schedules, checks, and issues. Scope:sites:deleteTeam permission:
delete siteResponse:
204 No Content
Checks
GET /sites/{site}/checks
Paginated check history for a site. Scope:checks:readTeam permission:
viewChecks
Query parameters:
| Parameter | Type | Description |
|---|---|---|
type | string | Tool filter |
status | string | Check status |
automatic | boolean | Automatic vs manual |
run_reason | string | scheduled, confirmation_retry, incident_follow_up |
from | date | created_at ≥ date |
to | date | created_at ≤ date (must be ≥ from) |
page, per_page | integer | Pagination |
200: Paginated Check collection
POST /sites/{site}/checks
Queue one or more manual checks. Scope:checks:runTeam permission:
createCheckRate limit: 10 requests / minute
Response:
202 Accepted with array of Check resources (usually pending)
Body:
| Field | Required | Description |
|---|---|---|
tools | no | Tool values to run; defaults to all enabled site tools |
automatic | no | Boolean; default false for API runs |
- Each tool must be enabled on the site
Poll
GET /checks/{check} until status is terminal. See Check results.GET /checks/{check}
Show one check by uuid, including fullresult and nested site summary.
Scope: checks:readTeam permission:
view check (via site team membership)
Response 200: Check resource
DELETE /checks/{check}
Delete a manual check (automatic: false).
Scope: checks:deleteTeam permission:
deleteCheckResponse:
204 on success; 403 for automatic checks
Reports
Read-only aggregates. Requiresites:read and view on the site.
GET /sites/{site}/reports/uptime
Daily uptime percentages from automatic status checks. Query:days (integer, default 90, max 365)
Response 200: Uptime report
GET /sites/{site}/reports/performance
Daily performance aggregates from automatic performance checks. Query:days (integer, default 30, max 365)
Response 200: Performance report
Issues
Read-only access to issue records. The dashboard Issues page supports acknowledge, resolve, and bulk actions; those operations are not available through the API.GET /issues
Paginated list of issues across teams the user can view. Scope:issues:readTeam permission:
viewIssues per team
Query parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
team | integer | — | Limit to one team id |
status | string | active | active (open + acknowledged), open, acknowledged, or resolved |
site | string | — | Site uuid |
tool | string | — | Check tool (status, ssl, dns, broken-links, performance) |
severity | string | — | critical, warning, info |
page, per_page | integer | Pagination (max 100 per page) |
200: Paginated collection of Issue resources.
GET /issues/{issue}
Retrieve a single issue with related site, check, timeline, and acknowledgement/resolution metadata. Scope:issues:readTeam permission:
view the issue’s team
Response 200: Issue resource
Endpoint summary
Quick reference table:| Method | Path | Scope |
|---|---|---|
GET | /me | teams:read |
GET | /teams | teams:read |
GET | /teams/{team} | teams:read |
GET | /teams/{team}/monitoring | teams:read |
PATCH | /teams/{team}/monitoring | teams:write |
GET | /teams/{team}/sites | sites:read |
POST | /teams/{team}/sites | sites:write |
POST | /teams/{team}/sites/bulk | sites:write |
GET | /sites/{site} | sites:read |
PATCH | /sites/{site} | sites:write |
DELETE | /sites/{site} | sites:delete |
GET | /sites/{site}/checks | checks:read |
POST | /sites/{site}/checks | checks:run |
GET | /sites/{site}/reports/uptime | sites:read |
GET | /sites/{site}/reports/performance | sites:read |
GET | /checks/{check} | checks:read |
DELETE | /checks/{check} | checks:delete |
GET | /issues | issues:read |
GET | /issues/{issue} | issues:read |