{"openapi":"3.1.1","info":{"title":"Sitepulse API","version":"1.0.0","description":"Website monitoring API. Create personal access tokens in Settings → API tokens as a verified user. Team membership, role permissions, and active plan access apply. There is no sandbox: writes affect real resources. API routes use the default API throttle; check runs are additionally limited to 10 requests per minute and per-tool cadence. The contact operation uses a separate marketing server. Based on the published API reference; tool-specific result payloads remain extensible.","contact":{"name":"Sitepulse support","email":"support@sitepulse.dev","url":"https://sitepulse.dev/support/"}},"servers":[{"url":"https://app.sitepulse.dev/api/v1","description":"Production monitoring API."}],"externalDocs":{"url":"https://docs.sitepulse.dev/api/endpoints","description":"Published HTTP reference."},"tags":[{"name":"teams","description":"Teams operations."},{"name":"sites","description":"Sites operations."},{"name":"checks","description":"Checks operations."},{"name":"issues","description":"Issues operations."},{"name":"contact","description":"Contact operations."}],"paths":{"/me":{"get":{"operationId":"getCurrentUser","summary":"Read the verified token owner and their teams","description":"Read the verified token owner and their teams.","tags":["teams"],"security":[{"PersonalAccessToken":["teams:read"]}],"parameters":[],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/User"},"teams":{"type":"array","items":{"$ref":"#/components/schemas/Team"}}}}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/teams":{"get":{"operationId":"listTeams","summary":"List teams the token owner can access","description":"List teams the token owner can access.","tags":["teams"],"security":[{"PersonalAccessToken":["teams:read"]}],"parameters":[],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Team"}}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/teams/{team}":{"get":{"operationId":"getTeam","summary":"Read one team and its plan limits","description":"Read one team and its plan limits. Requires team membership and active plan access.","tags":["teams"],"security":[{"PersonalAccessToken":["teams:read"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Team"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/teams/{team}/monitoring":{"get":{"operationId":"getTeamMonitoring","summary":"Read team monitoring defaults and plan-aware cadence presets","description":"Read team monitoring defaults and plan-aware cadence presets.","tags":["teams"],"security":[{"PersonalAccessToken":["teams:read"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TeamMonitoring"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"patch":{"operationId":"updateTeamMonitoring","summary":"Update team monitoring defaults as an owner or admin","description":"Update team monitoring defaults as an owner or admin. Send the full settings object; schedules are resynced for all team sites. DNS baselines are configured per site.","tags":["teams"],"security":[{"PersonalAccessToken":["teams:write"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"monitoring_settings":{"type":"object","properties":{"tools":{"type":"object","properties":{"status":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"incident_status_codes":{"type":"array","items":{"type":"integer"}},"failures_to_open":{"type":"integer","minimum":1},"successes_to_resolve":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"incident_follow_up_minutes":{"type":"integer","minimum":1,"maximum":60}}}},"required":["enabled","cadence_minutes"]},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"expiry_days":{"type":"integer","minimum":1},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5}}}},"required":["enabled","cadence_minutes"]},"dns":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"hard_failures_only":{"type":"boolean"},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"monitored_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}}}}},"required":["enabled","cadence_minutes"]},"broken-links":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"min_broken_count":{"type":"integer","minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1},"ignore_paths":{"type":"array","items":{"type":"string","maxLength":255}},"ignore_external_links":{"type":"boolean"},"ignore_redirects":{"type":"boolean"}}}},"required":["enabled","cadence_minutes"]},"performance":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"url":{"type":["string","null"],"format":"uri","description":"Audit URL on the same site domain; null uses the root."},"min_score":{"type":"integer","minimum":1,"maximum":100},"max_response_time_ms":{"type":["integer","null"],"minimum":1},"max_ttfb_ms":{"type":["integer","null"],"minimum":1},"max_load_time_seconds":{"type":["integer","null"],"minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1}}}},"required":["enabled","cadence_minutes"]}}},"request_header":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Valid HTTP header name. At site level, supply both name and value to override the team header."},"value":{"type":["string","null"],"maxLength":2000,"pattern":"^[^\r\n]*$"}}},"quiet_time":{"type":"object","properties":{"enabled":{"type":"boolean"},"starts_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"ends_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}}},"escalation":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervals":{"type":"array","items":{"type":"integer","enum":[0,15,30,60,360,1440]}}}}},"required":["tools"]}},"required":["monitoring_settings"]}}}},"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TeamMonitoring"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/teams/{team}/sites":{"get":{"operationId":"listSites","summary":"List sites in a team with latest checks","description":"List sites in a team with latest checks. Requires permission to view team sites.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:read"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","description":"Number of resources per page.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"search","in":"query","description":"Partial name or URL.","schema":{"type":"string"}},{"name":"pinned","in":"query","description":"Filter by pin state.","schema":{"type":"boolean"}},{"name":"tool","in":"query","description":"Enabled check tool.","schema":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}},{"name":"status","in":"query","description":"Latest check status.","schema":{"type":"string","enum":["pending","completed","failed","skipped"]}},{"name":"sort","in":"query","description":"Sort order.","schema":{"type":"string","enum":["created_at","-created_at","name","-name","pinned"]}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"links":{"type":"object","properties":{"first":{"type":"string"},"last":{"type":"string"},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer"},"from":{"type":["integer","null"]},"last_page":{"type":"integer"},"path":{"type":"string"},"per_page":{"type":"integer"},"to":{"type":["integer","null"]},"total":{"type":"integer"}}}},"required":["data","links","meta"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"post":{"operationId":"createSite","summary":"Create a monitored site with permission to create sites","description":"Create a monitored site with permission to create sites. Plan site limits and cadence floors apply.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:write"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https?://","description":"HTTP(S) URL; required on create and PATCH."},"name":{"type":"string"},"notes":{"type":["string","null"]},"js_rendered":{"type":"boolean"},"monitoring_settings":{"type":"object","properties":{"tools":{"type":"object","properties":{"status":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"incident_status_codes":{"type":"array","items":{"type":"integer"}},"failures_to_open":{"type":"integer","minimum":1},"successes_to_resolve":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"incident_follow_up_minutes":{"type":"integer","minimum":1,"maximum":60}}}},"required":["enabled","cadence_minutes"]},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"expiry_days":{"type":"integer","minimum":1},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5}}}},"required":["enabled","cadence_minutes"]},"dns":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"hard_failures_only":{"type":"boolean"},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"monitored_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}}}}},"required":["enabled","cadence_minutes"]},"broken-links":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"min_broken_count":{"type":"integer","minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1},"ignore_paths":{"type":"array","items":{"type":"string","maxLength":255}},"ignore_external_links":{"type":"boolean"},"ignore_redirects":{"type":"boolean"}}}},"required":["enabled","cadence_minutes"]},"performance":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"url":{"type":["string","null"],"format":"uri","description":"Audit URL on the same site domain; null uses the root."},"min_score":{"type":"integer","minimum":1,"maximum":100},"max_response_time_ms":{"type":["integer","null"],"minimum":1},"max_ttfb_ms":{"type":["integer","null"],"minimum":1},"max_load_time_seconds":{"type":["integer","null"],"minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1}}}},"required":["enabled","cadence_minutes"]}}},"request_header":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Valid HTTP header name. At site level, supply both name and value to override the team header."},"value":{"type":["string","null"],"maxLength":2000,"pattern":"^[^\r\n]*$"}}}},"description":"Per-site overrides. Omitted request_header inherits the team header."},"dns_expected_records":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Expected records by DNS record type. Empty object or null clears a site baseline on update."}},"required":["url"]}}}},"responses":{"201":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Site"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/teams/{team}/sites/bulk":{"post":{"operationId":"createSitesBulk","summary":"Create up to 100 sites","description":"Create up to 100 sites. Inspect created, skipped, and failed entries; do not retry the whole batch blindly.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:write"]}],"parameters":[{"name":"team","in":"path","required":true,"description":"team identifier returned by the API.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sites":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https?://","description":"HTTP(S) URL; required on create and PATCH."},"name":{"type":"string"}},"required":["url"]},"minItems":1,"maxItems":100}},"required":["sites"]}}}},"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"created":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"skipped":{"type":"array","items":{"type":["object","array","string","number","boolean","null"],"description":"Skipped entry; the published reference does not define its fields."}},"failed":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"error":{"type":"string"}}}}}}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/sites/{site}":{"get":{"operationId":"getSite","summary":"Read one site with its latest checks","description":"Read one site with its latest checks. Cross-team access returns 404.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:read"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Site"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"patch":{"operationId":"updateSite","summary":"Update a site with site-update permission","description":"Update a site with site-update permission. URL is required even on PATCH. Changing tools or cadences resyncs automatic schedules.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:write"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https?://","description":"HTTP(S) URL; required on create and PATCH."},"name":{"type":"string"},"notes":{"type":["string","null"]},"js_rendered":{"type":"boolean"},"monitoring_settings":{"type":"object","properties":{"tools":{"type":"object","properties":{"status":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"incident_status_codes":{"type":"array","items":{"type":"integer"}},"failures_to_open":{"type":"integer","minimum":1},"successes_to_resolve":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"incident_follow_up_minutes":{"type":"integer","minimum":1,"maximum":60}}}},"required":["enabled","cadence_minutes"]},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"expiry_days":{"type":"integer","minimum":1},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5}}}},"required":["enabled","cadence_minutes"]},"dns":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"hard_failures_only":{"type":"boolean"},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"monitored_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}}}}},"required":["enabled","cadence_minutes"]},"broken-links":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"min_broken_count":{"type":"integer","minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1},"ignore_paths":{"type":"array","items":{"type":"string","maxLength":255}},"ignore_external_links":{"type":"boolean"},"ignore_redirects":{"type":"boolean"}}}},"required":["enabled","cadence_minutes"]},"performance":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"url":{"type":["string","null"],"format":"uri","description":"Audit URL on the same site domain; null uses the root."},"min_score":{"type":"integer","minimum":1,"maximum":100},"max_response_time_ms":{"type":["integer","null"],"minimum":1},"max_ttfb_ms":{"type":["integer","null"],"minimum":1},"max_load_time_seconds":{"type":["integer","null"],"minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1}}}},"required":["enabled","cadence_minutes"]}}},"request_header":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Valid HTTP header name. At site level, supply both name and value to override the team header."},"value":{"type":["string","null"],"maxLength":2000,"pattern":"^[^\r\n]*$"}}}},"description":"Per-site overrides. Omitted request_header inherits the team header."},"dns_expected_records":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Expected records by DNS record type. Empty object or null clears a site baseline on update."},"pinned":{"type":"boolean"}},"required":["url"]}}}},"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Site"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"delete":{"operationId":"deleteSite","summary":"Permanently delete a site and its schedules, checks, and issues","description":"Permanently delete a site and its schedules, checks, and issues. Requires site-delete permission and explicit user authorization.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:delete"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted; no response body."},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/sites/{site}/checks":{"get":{"operationId":"listChecks","summary":"Read paginated check history with permission to view checks","description":"Read paginated check history with permission to view checks.","tags":["checks"],"security":[{"PersonalAccessToken":["checks:read"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","description":"Number of resources per page.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"type","in":"query","description":"Check tool.","schema":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}},{"name":"status","in":"query","description":"Check status.","schema":{"type":"string","enum":["pending","completed","failed","skipped"]}},{"name":"automatic","in":"query","description":"Scheduled or on-demand checks.","schema":{"type":"boolean"}},{"name":"run_reason","in":"query","description":"Automatic run reason.","schema":{"type":"string","enum":["scheduled","confirmation_retry","incident_follow_up"]}},{"name":"from","in":"query","description":"Include checks created on or after this date.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","description":"Include checks created on or before this date; must be on or after from.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Check"}},"links":{"type":"object","properties":{"first":{"type":"string"},"last":{"type":"string"},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer"},"from":{"type":["integer","null"]},"last_page":{"type":"integer"},"path":{"type":"string"},"per_page":{"type":"integer"},"to":{"type":["integer","null"]},"total":{"type":"integer"}}}},"required":["data","links","meta"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"post":{"operationId":"runChecks","summary":"Queue on-demand checks with createCheck permission","description":"Queue on-demand checks with createCheck permission. Each check consumes monthly quota. Limited to 10 requests per minute plus per-tool cadence protection. Poll returned check identifiers; on-demand results do not drive automatic incidents.","tags":["checks"],"security":[{"PersonalAccessToken":["checks:run"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]},"description":"Omit to run all enabled site tools. Tools must be enabled and have no pending on-demand run."},"automatic":{"type":"boolean","const":false,"deprecated":true,"description":"API checks are always on-demand. True returns 422."}}}}}},"responses":{"202":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Check"}}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/checks/{check}":{"get":{"operationId":"getCheck","summary":"Read a check and tool-specific result","description":"Read a check and tool-specific result. Poll until completed, failed, or skipped.","tags":["checks"],"security":[{"PersonalAccessToken":["checks:read"]}],"parameters":[{"name":"check","in":"path","required":true,"description":"check identifier returned by the API.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Check"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}},"delete":{"operationId":"deleteCheck","summary":"Delete an on-demand check with deleteCheck permission","description":"Delete an on-demand check with deleteCheck permission. Automatic checks cannot be deleted and return 403.","tags":["checks"],"security":[{"PersonalAccessToken":["checks:delete"]}],"parameters":[{"name":"check","in":"path","required":true,"description":"check identifier returned by the API.","schema":{"type":"string"}}],"responses":{"204":{"description":"Deleted; no response body."},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/sites/{site}/reports/uptime":{"get":{"operationId":"getUptimeReport","summary":"Read daily aggregates from automatic completed status checks","description":"Read daily aggregates from automatic completed status checks. Days without checks contain null metrics.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:read"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}},{"name":"days","in":"query","description":"Report range in days.","schema":{"type":"integer","minimum":1,"maximum":365,"default":90}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/UptimeReport"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/sites/{site}/reports/performance":{"get":{"operationId":"getPerformanceReport","summary":"Read daily aggregates from automatic completed performance checks","description":"Read daily aggregates from automatic completed performance checks. Days without checks contain null metrics.","tags":["sites"],"security":[{"PersonalAccessToken":["sites:read"]}],"parameters":[{"name":"site","in":"path","required":true,"description":"site identifier returned by the API.","schema":{"type":"string"}},{"name":"days","in":"query","description":"Report range in days.","schema":{"type":"integer","minimum":1,"maximum":365,"default":30}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PerformanceReport"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/issues":{"get":{"operationId":"listIssues","summary":"Read incidents across teams with viewIssues permission","description":"Read incidents across teams with viewIssues permission. Active includes open and acknowledged. Acknowledge and resolve actions are dashboard-only.","tags":["issues"],"security":[{"PersonalAccessToken":["issues:read"]}],"parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","description":"Number of resources per page.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"team","in":"query","description":"Team identifier.","schema":{"type":"string"}},{"name":"site","in":"query","description":"Site identifier.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Issue status.","schema":{"type":"string","enum":["active","open","acknowledged","resolved"],"default":"active"}},{"name":"tool","in":"query","description":"Check tool.","schema":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}},{"name":"severity","in":"query","description":"Issue severity.","schema":{"type":"string","enum":["critical","warning","info"]}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Issue"}},"links":{"type":"object","properties":{"first":{"type":"string"},"last":{"type":"string"},"prev":{"type":["string","null"]},"next":{"type":["string","null"]}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer"},"from":{"type":["integer","null"]},"last_page":{"type":"integer"},"path":{"type":"string"},"per_page":{"type":"integer"},"to":{"type":["integer","null"]},"total":{"type":"integer"}}}},"required":["data","links","meta"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/issues/{issue}":{"get":{"operationId":"getIssue","summary":"Read an issue with site, check, lifecycle timeline, and acknowledgement metadata","description":"Read an issue with site, check, lifecycle timeline, and acknowledgement metadata. Requires permission to view its team.","tags":["issues"],"security":[{"PersonalAccessToken":["issues:read"]}],"parameters":[{"name":"issue","in":"path","required":true,"description":"issue identifier returned by the API.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Issue"}},"required":["data"]}}}},"401":{"description":"Missing, expired, or invalid token, or unverified email. Supply a valid token from a verified user.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"402":{"description":"Active team plan access required. Review team billing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Missing scope or role permission. Request only the required permissions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource not found or outside your teams. Check identifiers and membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct the fields listed in errors before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After when provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait when provided by the server.","schema":{"type":"integer"}}}}}}},"/api/contact":{"servers":[{"url":"https://sitepulse.dev","description":"Marketing contact form; separate from the monitoring API."}],"post":{"operationId":"submitContactForm","summary":"Submit the website contact form","description":"Send a support message from the marketing website. Same-origin Origin or Referer is required. Limited to 10 submissions per 10 minutes and 30 per day per IP. JSON callers receive JSON; browser form submissions redirect to support. This does not create monitors or API tokens.","tags":["contact"],"security":[],"parameters":[{"name":"Origin","in":"header","required":false,"description":"Must match the request host; a same-origin Referer may be used instead.","schema":{"type":"string","format":"uri"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"type":"string","format":"email","maxLength":200},"topic":{"type":"string","enum":["","General question","Billing","Technical issue","Bug report","Feature request","Other"]},"message":{"type":"string","minLength":10,"maxLength":5000},"company":{"type":"string","description":"Spam trap. Leave empty."}},"required":["name","email","message"]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"type":"string","format":"email","maxLength":200},"topic":{"type":"string","enum":["","General question","Billing","Technical issue","Bug report","Feature request","Other"]},"message":{"type":"string","minLength":10,"maxLength":5000},"company":{"type":"string","description":"Spam trap. Leave empty."}},"required":["name","email","message"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"type":"string","format":"email","maxLength":200},"topic":{"type":"string","enum":["","General question","Billing","Technical issue","Bug report","Feature request","Other"]},"message":{"type":"string","minLength":10,"maxLength":5000},"company":{"type":"string","description":"Spam trap. Leave empty."}},"required":["name","email","message"]}}}},"responses":{"200":{"description":"Message accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResult"}}}},"303":{"description":"Browser form fallback redirects to the support page with sent or error state.","headers":{"Location":{"schema":{"type":"string"},"description":"Support page URL with outcome flag."}}},"400":{"description":"Invalid fields or unreadable body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"403":{"description":"Same-origin enforcement failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"405":{"description":"Use POST.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}},"headers":{"Allow":{"schema":{"type":"string","const":"POST"},"description":"Supported method."}}},"429":{"description":"Contact rate limit exceeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}},"headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the rate window resets."}}},"500":{"description":"Contact service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"502":{"description":"Email delivery failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}}}}}},"components":{"securitySchemes":{"PersonalAccessToken":{"type":"http","scheme":"bearer","description":"Scoped personal access token created in Settings → API tokens. Expires after six months. OpenAPI 3.1 security requirement role names declare the token permissions needed per operation. No OAuth exchange endpoint is published.","x-scopes":{"teams:read":"Read teams, plan limits, and team monitoring defaults.","teams:write":"Update team monitoring defaults.","sites:read":"Read sites and site monitoring data.","sites:write":"Create and update sites.","sites:delete":"Delete sites.","checks:read":"Read check runs and results.","checks:run":"Queue on-demand check runs.","checks:delete":"Delete on-demand check runs.","issues:read":"Read monitoring incidents."}}},"schemas":{"User":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"email_verified_at":{"type":["string","null"],"format":"date-time"}}},"Team":{"type":"object","properties":{"uuid":{"type":"string"},"name":{"type":"string"},"sites_count":{"type":"integer"},"members_count":{"type":"integer"},"limits":{"type":"object","properties":{"plan":{"type":"string","enum":["starter","growth","agency"]},"sites":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":["integer","null"]},"remaining":{"type":["integer","null"]}}},"seats":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":["integer","null"]},"remaining":{"type":["integer","null"]},"members":{"type":"integer"},"pending_invitations":{"type":"integer"}}},"manual_checks":{"type":"object","properties":{"used":{"type":"integer"},"limit":{"type":["integer","null"]},"remaining":{"type":["integer","null"]}}},"enabled_checks":{"type":"object","properties":{"allowed":{"type":"array","items":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}}}},"minimum_check_cadence_minutes":{"type":["integer","null"]},"history_retention_days":{"type":["integer","null"]}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"MonitoringSettings":{"type":"object","properties":{"tools":{"type":"object","properties":{"status":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"incident_status_codes":{"type":"array","items":{"type":"integer"}},"failures_to_open":{"type":"integer","minimum":1},"successes_to_resolve":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"incident_follow_up_minutes":{"type":"integer","minimum":1,"maximum":60}}}},"required":["enabled","cadence_minutes"]},"ssl":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"expiry_days":{"type":"integer","minimum":1},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5}}}},"required":["enabled","cadence_minutes"]},"dns":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"hard_failures_only":{"type":"boolean"},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"monitored_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}}}}},"required":["enabled","cadence_minutes"]},"broken-links":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"min_broken_count":{"type":"integer","minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1},"ignore_paths":{"type":"array","items":{"type":"string","maxLength":255}},"ignore_external_links":{"type":"boolean"},"ignore_redirects":{"type":"boolean"}}}},"required":["enabled","cadence_minutes"]},"performance":{"type":"object","properties":{"enabled":{"type":"boolean"},"cadence_minutes":{"type":"integer","minimum":1,"description":"Use a cadence preset allowed by the team plan; broken-links and performance have a 720-minute floor."},"settings":{"type":"object","properties":{"url":{"type":["string","null"],"format":"uri","description":"Audit URL on the same site domain; null uses the root."},"min_score":{"type":"integer","minimum":1,"maximum":100},"max_response_time_ms":{"type":["integer","null"],"minimum":1},"max_ttfb_ms":{"type":["integer","null"],"minimum":1},"max_load_time_seconds":{"type":["integer","null"],"minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1}}}},"required":["enabled","cadence_minutes"]}}},"request_header":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255,"description":"Valid HTTP header name. At site level, supply both name and value to override the team header."},"value":{"type":["string","null"],"maxLength":2000,"pattern":"^[^\r\n]*$"}}},"quiet_time":{"type":"object","properties":{"enabled":{"type":"boolean"},"starts_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"ends_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}}},"escalation":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervals":{"type":"array","items":{"type":"integer","enum":[0,15,30,60,360,1440]}}}}}},"TeamMonitoring":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/MonitoringSettings"},"minimum_check_cadence_minutes":{"type":["integer","null"]},"cadence_presets":{"type":"array","items":{"type":"object","properties":{"minutes":{"type":"integer"},"label":{"type":"string"},"disabled":{"type":"boolean"}}}},"allowed_tools":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]},"label":{"type":"string"},"minimum_check_cadence_minutes":{"type":"integer"}}}},"failure_threshold_presets":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"failures_to_open":{"type":"integer"}}}},"escalation_interval_presets":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"minutes":{"type":"integer"}}}},"dns_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}},"status_incident_code_options":{"type":"array","items":{"type":"object","properties":{"code":{"type":"integer"},"label":{"type":"string"},"group":{"type":"string","enum":["client","server"]}}}}}},"Site":{"type":"object","properties":{"uuid":{"type":"string"},"team_uuid":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"domain":{"type":"string"},"notes":{"type":["string","null"]},"js_rendered":{"type":"boolean"},"is_pinned":{"type":"boolean"},"enabled_checks":{"type":"array","items":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}},"monitoring":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/MonitoringSettings"}}},"issue_settings":{"type":"object","properties":{"enabled_tools":{"type":"array","items":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]}},"status":{"type":"object","properties":{"incident_status_codes":{"type":"array","items":{"type":"integer"}},"failures_to_open":{"type":"integer","minimum":1},"successes_to_resolve":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"incident_follow_up_minutes":{"type":"integer","minimum":1,"maximum":60}}},"ssl":{"type":"object","properties":{"expiry_days":{"type":"integer","minimum":1},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5}}},"links":{"type":"object","properties":{"min_broken_count":{"type":"integer","minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1},"ignore_paths":{"type":"array","items":{"type":"string","maxLength":255}},"ignore_external_links":{"type":"boolean"},"ignore_redirects":{"type":"boolean"}}},"performance":{"type":"object","properties":{"url":{"type":["string","null"],"format":"uri","description":"Audit URL on the same site domain; null uses the root."},"min_score":{"type":"integer","minimum":1,"maximum":100},"max_response_time_ms":{"type":["integer","null"],"minimum":1},"max_ttfb_ms":{"type":["integer","null"],"minimum":1},"max_load_time_seconds":{"type":["integer","null"],"minimum":1},"consecutive_breaches_to_open":{"type":"integer","minimum":1}}},"dns":{"type":"object","properties":{"hard_failures_only":{"type":"boolean"},"failures_to_open":{"type":"integer","minimum":1},"confirmation_retry_minutes":{"type":"integer","minimum":1,"maximum":5},"monitored_record_types":{"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","NS","TXT"]}},"expected_records":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Expected records by DNS record type. Empty object or null clears a site baseline on update."}}},"quiet_time":{"type":"object","properties":{"enabled":{"type":"boolean"},"starts_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"ends_at":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"}}},"escalation":{"type":"object","properties":{"enabled":{"type":"boolean"},"intervals":{"type":"array","items":{"type":"integer","enum":[0,15,30,60,360,1440]}}}}}},"latest_checks":{"type":"object","properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"ssl":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"dns":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"broken-links":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"performance":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]}}},"reports":{"type":"object","properties":{"uptime":{"type":"string","format":"uri"},"performance":{"type":"string","format":"uri"}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Check":{"type":"object","properties":{"uuid":{"type":"string"},"type":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]},"status":{"type":"string","enum":["pending","completed","failed","skipped"]},"automatic":{"type":"boolean"},"run_reason":{"type":["string","null"],"enum":["scheduled","confirmation_retry","incident_follow_up",null]},"site":{"anyOf":[{"type":"object","properties":{"uuid":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"domain":{"type":"string"}}},{"type":"null"}]},"result":{"type":["object","array","string","number","boolean","null"],"description":"Tool-specific payload; see https://docs.sitepulse.dev/api/check-results.md."},"error":{"type":["object","array","string","number","boolean","null"],"description":"Tool-specific payload; see https://docs.sitepulse.dev/api/check-results.md."},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}}},"Issue":{"type":"object","properties":{"uuid":{"type":"string"},"team_uuid":{"type":"string"},"type":{"type":"string","enum":["status","ssl","dns","broken-links","performance"]},"status":{"type":"string","enum":["open","acknowledged","resolved"]},"severity":{"type":"string","enum":["critical","warning","info"]},"fingerprint":{"type":"string"},"summary":{"type":"string"},"context":{"type":["object","null"],"additionalProperties":true},"site":{"anyOf":[{"$ref":"#/components/schemas/Site"},{"type":"null"}]},"check":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"previous_check":{"anyOf":[{"$ref":"#/components/schemas/Check"},{"type":"null"}]},"acknowledged_by":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"resolved_by":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"timeline":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["opened","acknowledged","resolved"]},"timestamp":{"type":"string","format":"date-time"},"user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]}}}},"is_active":{"type":"boolean"},"opened_at":{"type":"string","format":"date-time"},"acknowledged_at":{"type":["string","null"],"format":"date-time"},"resolved_at":{"type":["string","null"],"format":"date-time"},"last_evaluated_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"UptimeReport":{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"uptime_percentage":{"type":["number","null"]},"response_time":{"type":["integer","null"]},"total_checks":{"type":"integer"},"up_checks":{"type":"integer"}}}},"total_uptime_percentage":{"type":["number","null"]},"average_response_time":{"type":["integer","null"]}}},"PerformanceReport":{"type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"performance_score":{"type":["number","null"]},"response_time":{"type":["integer","null"]},"speed":{"type":["number","null"]},"total_checks":{"type":"integer"}}}},"average_performance_score":{"type":["number","null"]},"average_response_time":{"type":["integer","null"]},"average_speed":{"type":["number","null"]},"total_checks":{"type":"integer"}}},"ApiError":{"type":"object","properties":{"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"required":["message"]},"ContactResult":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"message":{"type":"string"}},"required":["ok","message"]},"ContactError":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"message":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}},"required":["code","message","hint"]}},"required":["ok","message","error"]}}}}