Monitorion covers every layer of your infrastructure — from basic HTTP uptime to Core Web Vitals, DNS integrity, email server health, and cryptographic certificate validity. This reference documents every configuration field, status value, and use case for each monitor type.
Full-stack HTTP availability and response validation
The HTTP monitor performs a real HTTP/HTTPS request to your URL at a configured interval and validates the response against a set of assertions — status code, body keywords, CSS selector content, and response time thresholds. It is the foundation of uptime monitoring and works for any publicly reachable web endpoint.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Full URL to request (https://example.com or http://...). HTTPS is strongly recommended. |
| method | enum | No | HTTP method: GET (default), POST, PUT, PATCH, HEAD, OPTIONS. |
| expected_status | number | No | Expected HTTP status code. Defaults to 200. Any deviation triggers an alert. |
| keyword | string | No | A text string that must appear in the response body. Case-sensitive. |
| keyword_mode | enum | No | "contains" (must be present) or "absent" (must not be present). Defaults to contains. |
| css_selector | string | No | CSS selector whose matched element text is compared against selector_value. |
| selector_value | string | No | Expected inner text of the element matched by css_selector. |
| headers | object | No | Key/value pairs sent as request headers (e.g., Authorization, Accept-Language). |
| body | string | No | Request body for POST/PUT/PATCH requests. Typically JSON or form-encoded. |
| timeout_ms | number | No | Maximum time in milliseconds to wait for a response. Default 10 000 ms. Max 30 000 ms. |
| follow_redirects | boolean | No | Whether to follow HTTP 3xx redirects. Default true. |
| tls_verify | boolean | No | Reject requests with invalid TLS certificates. Default true. Disable only for testing. |
| interval_seconds | number | No | Check frequency: 300 (Free), 60 (Pro), 30 (Business). In seconds. |
| Status | Meaning |
|---|---|
| up | Request succeeded, all assertions passed, response within timeout. |
| down | Status code mismatch, keyword not found, connection refused, or timeout exceeded. |
| degraded | Request succeeded but response time exceeded a soft latency threshold (warning only). |
| paused | Monitor is manually paused or inside a scheduled maintenance window. |
{
"type": "http",
"name": "Marketing Homepage",
"url": "https://example.com",
"method": "GET",
"expected_status": 200,
"keyword": "Welcome to Acme",
"headers": {
"Accept-Language": "en-US"
},
"timeout_ms": 8000,
"follow_redirects": true,
"interval_seconds": 60
}Network-layer reachability using ICMP echo requests
The Ping monitor sends ICMP echo request packets to a hostname or IP address and measures round-trip latency and packet loss. Unlike HTTP monitoring, Ping operates at the network layer — useful for bare-metal servers, VMs, and devices that do not expose an HTTP endpoint. Note that some hosting providers and firewalls block ICMP; in such cases the monitor will report the host as down even if it is functional.
| Field | Type | Required | Description |
|---|---|---|---|
| host | string | Yes | Hostname (db.example.com) or IPv4/IPv6 address to ping. |
| packet_count | number | No | Number of ICMP packets to send per check. Default 3. Range 1–10. |
| timeout_ms | number | No | Timeout per packet in milliseconds. Default 5 000 ms. |
| latency_warning_ms | number | No | Average RTT threshold in ms that triggers a "degraded" status. Default: none. |
| latency_critical_ms | number | No | Average RTT threshold in ms that triggers a "down" alert. Default: none. |
| loss_threshold_pct | number | No | Packet loss percentage above which the monitor is considered down. Default 100 (all packets lost). |
| interval_seconds | number | No | Check frequency in seconds. 300 (Free), 60 (Pro), 30 (Business). |
| Status | Meaning |
|---|---|
| up | Host is reachable, packet loss within threshold, latency within limits. |
| degraded | Host is reachable but average RTT exceeds latency_warning_ms. |
| down | Host is unreachable, all packets lost, or average RTT exceeds latency_critical_ms. |
| paused | Monitor is paused or in a maintenance window. |
{
"type": "ping",
"name": "Primary Database Server",
"host": "db.internal.example.com",
"packet_count": 5,
"timeout_ms": 3000,
"latency_warning_ms": 50,
"latency_critical_ms": 200,
"loss_threshold_pct": 20,
"interval_seconds": 60
}Track certificate validity, expiry, and chain integrity
The SSL Certificate monitor connects to a domain over TLS, retrieves the certificate chain, and reports on expiry date, issuer, and chain validity. It alerts you before your certificate expires so you never serve a browser security warning to your visitors. Supports wildcard certificates and detects unexpected issuer changes (e.g., due to a hijack or misconfiguration).
| Field | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | Domain name to check (e.g., example.com). Do not include https:// or a path. |
| port | number | No | Port to connect on. Default 443. Use 8443 or custom ports for non-standard HTTPS. |
| warn_days_before | number | No | Trigger a warning alert this many days before expiry. Default 30. Common: 30, 14, 7. |
| critical_days_before | number | No | Trigger a critical alert this many days before expiry. Default 7. |
| check_chain | boolean | No | Verify the full certificate chain, not just the leaf certificate. Default true. |
| expected_issuer | string | No | Expected issuer organization name (e.g., "Let's Encrypt"). Alert if issuer changes. |
| interval_seconds | number | No | How often to check. Typically 3 600 (hourly) or 86 400 (daily) — expiry changes slowly. |
| Status | Meaning |
|---|---|
| valid | Certificate is valid, chain is intact, and expiry is beyond warn_days_before. |
| expiring | Certificate expires within warn_days_before days. Take action to renew. |
| critical | Certificate expires within critical_days_before days. Immediate renewal required. |
| expired | Certificate has already expired. Visitors will see browser security errors. |
| invalid | Certificate chain is broken, domain mismatch, or connection could not be established. |
{
"type": "ssl",
"name": "Production HTTPS Certificate",
"domain": "example.com",
"port": 443,
"warn_days_before": 30,
"critical_days_before": 7,
"check_chain": true,
"expected_issuer": "Let's Encrypt",
"interval_seconds": 3600
}WHOIS-based tracking of domain registration expiry
The Domain Expiry monitor performs a WHOIS lookup for your domain name and extracts the expiration date reported by the registry. It alerts you before the domain lapses so you never lose a domain to accidental non-renewal. The monitor also surfaces the registrar name and name server information for quick reference.
| Field | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | Fully qualified domain name (e.g., example.com, mycompany.io). TLDs with WHOIS restrictions may have limited data. |
| warn_days_before | number | No | Warn this many days before registration expiry. Default 30. |
| critical_days_before | number | No | Critical alert this many days before expiry. Default 7. |
| interval_seconds | number | No | WHOIS query frequency. Default 86 400 (daily). More frequent queries may be throttled by some registries. |
In addition to status, the monitor dashboard card shows: Registrar name, Name servers in use, Registration date, and Days remaining until expiry.
| Status | Meaning |
|---|---|
| active | Domain is registered and expiry is beyond warn_days_before. |
| expiring_soon | Domain expires within warn_days_before days. |
| critical | Domain expires within critical_days_before days — renew immediately. |
| expired | Domain registration has lapsed. It may be in redemption period or available for registration. |
| whois_error | WHOIS lookup failed (registry throttle, unsupported TLD, or network error). |
{
"type": "domain_expiry",
"name": "Company Primary Domain",
"domain": "example.com",
"warn_days_before": 30,
"critical_days_before": 7,
"interval_seconds": 86400
}TCP / UDP connectivity checks for any host:port combination
The Port monitor attempts to open a TCP or UDP connection to a specified host and port number. It verifies that the service is accepting connections within the configured timeout, without regard to application-layer protocol. Ideal for databases, SSH servers, game servers, custom daemons, and any service not reachable over HTTP.
| Field | Type | Required | Description |
|---|---|---|---|
| host | string | Yes | Hostname or IP address of the server to check. |
| port | number | Yes | TCP or UDP port number (1–65 535). Common: 22 (SSH), 3306 (MySQL), 5432 (Postgres), 6379 (Redis), 27017 (MongoDB). |
| protocol | enum | No | "tcp" (default) or "udp". UDP checks send a probe packet and listen for a response. |
| timeout_ms | number | No | Connection timeout in milliseconds. Default 5 000. Max 30 000. |
| send_string | string | No | Optional string to send after connecting (TCP only). Useful for banner-based protocols. |
| expect_string | string | No | Optional string to match in the server response after send_string. Alert if absent. |
| interval_seconds | number | No | Check frequency. 60 (Pro), 30 (Business). |
| Status | Meaning |
|---|---|
| open | Connection established within timeout. If expect_string is set, it was found in the response. |
| closed | Connection refused (port is actively rejecting connections — service likely stopped). |
| timeout | No response received within timeout_ms (firewall drop, overloaded host, or wrong address). |
| mismatch | Connected successfully but expect_string was not found in the server banner/response. |
{
"type": "port",
"name": "Production PostgreSQL",
"host": "db.prod.example.com",
"port": 5432,
"protocol": "tcp",
"timeout_ms": 4000,
"interval_seconds": 60
}Alert on unexpected changes to A, AAAA, CNAME, MX, and TXT records
The DNS Records monitor performs authoritative DNS lookups at regular intervals and compares the returned records against a known-good baseline. Any deviation — new records, removed records, or changed values — triggers an immediate alert. This protects against DNS hijacking, accidental zone edits, propagation failures, and forgotten TTL-cached stale values.
| Field | Type | Required | Description |
|---|---|---|---|
| domain | string | Yes | Domain or subdomain to query (e.g., example.com, mail.example.com). |
| record_type | enum | Yes | DNS record type to monitor: A, AAAA, CNAME, MX, TXT, NS, PTR, SOA. |
| expected_values | string[] | No | Array of expected DNS values. Leave empty to auto-capture baseline on first successful check. |
| nameserver | string | No | Custom resolver IP or hostname. Defaults to 1.1.1.1 (Cloudflare). Useful for checking authoritative servers directly. |
| alert_on_change | boolean | No | Send alert whenever the resolved value differs from expected_values. Default true. |
| interval_seconds | number | No | Query frequency. Minimum 60 (Pro). 30 (Business). |
| Status | Meaning |
|---|---|
| match | Resolved values match expected_values exactly. |
| changed | One or more resolved values differ from the expected baseline. Alert fired. |
| nxdomain | Domain does not exist (NXDOMAIN). The record has been deleted or domain has lapsed. |
| timeout | DNS query timed out. May indicate resolver issues or DDoS on authoritative servers. |
{
"type": "dns",
"name": "Root A Record – example.com",
"domain": "example.com",
"record_type": "A",
"expected_values": ["203.0.113.42"],
"nameserver": "1.1.1.1",
"alert_on_change": true,
"interval_seconds": 60
}{
"type": "dns",
"name": "MX Records – example.com",
"domain": "example.com",
"record_type": "MX",
"expected_values": [
"10 mail.example.com.",
"20 mail2.example.com."
],
"alert_on_change": true,
"interval_seconds": 300
}Reverse monitoring — your job pings Monitorion; we alert if it stops
Unlike all other monitor types, the Heartbeat monitor works in reverse: instead of Monitorion reaching out to your system, your system (a cron job, backup script, CI pipeline, or any scheduled task) makes a simple HTTP GET or POST request to a unique Monitorion URL after each successful run. If Monitorion does not receive a ping within the configured period plus grace time, it fires an alert. This catches silent cron failures, missed backups, and stuck ETL pipelines.
After creating the monitor, you receive a unique ping URL like:
# Ping URL format
https://app.monitorion.com/api/heartbeat/hb_a1b2c3d4e5f6
# Add to your cron job (curl or wget)
0 3 * * * /usr/local/bin/backup.sh && \
curl -s https://app.monitorion.com/api/heartbeat/hb_a1b2c3d4e5f6
# Or report failure vs success with query params
curl -s "https://app.monitorion.com/api/heartbeat/hb_a1b2c3d4e5f6?status=fail&msg=Disk+full"| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Human-readable name for the job (e.g., "Nightly DB Backup"). |
| expected_period_seconds | number | Yes | How often (in seconds) you expect a ping. 3 600 = hourly, 86 400 = daily. |
| grace_seconds | number | No | Extra time to wait before alerting after the period elapses. Accounts for job duration variance. Default 300 (5 min). |
| alert_on_failure_ping | boolean | No | Also alert when the job itself pings with ?status=fail. Default true. |
| Status | Meaning |
|---|---|
| healthy | A ping was received within the expected period. |
| late | Period has elapsed but still within grace_seconds. No alert yet. |
| missed | No ping received after period + grace_seconds. Alert has fired. |
| failed | Job pinged with ?status=fail, indicating the job itself reported an error. |
Grade your HTTP response headers from A+ to F
The Security Headers monitor fetches a URL and analyses the HTTP response headers against security best practices. It awards a letter grade (A+ to F) and flags each missing or misconfigured header individually. Headers are checked against the OWASP Secure Headers Project recommendations and Mozilla Observatory criteria.
| Header | Impact | What it prevents |
|---|---|---|
| Content-Security-Policy | Critical | XSS and data injection attacks |
| Strict-Transport-Security | Critical | Protocol downgrade and cookie hijacking |
| X-Frame-Options | High | Clickjacking via iframes |
| X-Content-Type-Options | Medium | MIME-sniffing attacks |
| Referrer-Policy | Medium | Sensitive URL leakage to third parties |
| Permissions-Policy | Medium | Unauthorised access to browser APIs (camera, mic, GPS) |
| Cross-Origin-Opener-Policy | Medium | Cross-origin info leaks via window.opener |
| Cross-Origin-Resource-Policy | Medium | Embedding of resources by other origins |
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL to fetch and analyse. Should be the canonical HTTPS root of your site. |
| follow_redirects | boolean | No | Follow redirects before analysing headers. Default true. |
| grade_threshold | string | No | Minimum acceptable grade. Alert if grade drops below this. Values: A+, A, B, C, D, F. Default: B. |
| interval_seconds | number | No | Check frequency. Default 3 600 (hourly) — headers rarely change but regressions happen after deploys. |
| Status | Meaning |
|---|---|
| A+ | All critical and high-impact headers present with strict values. |
| A | All critical headers present; minor medium-impact headers missing. |
| B | Critical headers present but with weak directives; some medium headers absent. |
| C | Key headers missing or misconfigured. User data potentially exposed. |
| D | Multiple critical headers absent. Significant attack surface. |
| F | Most security headers absent. High risk of XSS and clickjacking attacks. |
Check your IP or domain against 5+ DNSBL spam blacklists
The Blacklist monitor queries your IP address or domain against a curated set of DNS-based block lists (DNSBLs) and reputation databases. Being listed on a blacklist can silently destroy your email deliverability, cause your website to be blocked by corporate firewalls, and reduce SEO visibility. This monitor alerts you the moment any listing is detected so you can act before it affects your users.
The following DNSBL services are queried on every check cycle. The list is maintained and updated by Monitorion as new authoritative lists emerge:
| Field | Type | Required | Description |
|---|---|---|---|
| target | string | Yes | IPv4 address, IPv6 address, or domain name to check against the blacklists. |
| target_type | enum | No | "ip" or "domain". Monitorion auto-detects; use this to override. |
| lists | string[] | No | Subset of blacklists to query. Leave empty to query all lists. Useful if certain lists are known false-positives for your environment. |
| interval_seconds | number | No | Query frequency. Default 3 600 (hourly). Higher frequency is supported on Business plans. |
| Status | Meaning |
|---|---|
| clean | IP/domain is not listed on any checked blacklist. |
| listed | IP/domain found on one or more blacklists. Alert fired with list names and delisting instructions. |
| partial | Listed on minor or less-impactful lists only. Review recommended. |
| error | One or more DNSBL queries failed (network issue). Results may be incomplete. |
Detect changes in page content or targeted CSS selector elements
The Content Change monitor fetches a URL, optionally extracts a specific element using a CSS selector, and compares the content against a stored snapshot. Any detected change triggers an alert with a diff of what changed. You can monitor entire pages or scope to a specific element — useful for price tracking, legal policy monitoring, competitor analysis, or detecting unauthorised site modifications.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL of the page to monitor for changes. |
| css_selector | string | No | CSS selector to scope the comparison to a specific element. Leave empty to compare the entire page body. |
| ignore_selectors | string[] | No | Array of CSS selectors to strip from the page before comparison (e.g., ad banners, timestamps). Reduces noise. |
| include_style | boolean | No | Include style attribute changes in the diff. Default false (text content only). |
| threshold_pct | number | No | Minimum percentage of content that must change before alerting. Default 0 (any change). Useful for noisy pages. |
| alert_mode | enum | No | "any_change" (default) or "keyword_appears" / "keyword_disappears". For targeted change detection. |
| keyword | string | No | Keyword to watch for (used with alert_mode keyword_appears or keyword_disappears). |
| interval_seconds | number | No | Check frequency. Minimum 60 (Pro), 30 (Business). |
| Status | Meaning |
|---|---|
| unchanged | Content matches the last stored snapshot (or is within threshold_pct). |
| changed | Content differs from stored snapshot. Alert fired with change diff preview. |
| error | Page could not be fetched or CSS selector matched no elements. |
{
"type": "content_change",
"name": "Competitor Pricing Page",
"url": "https://competitor.com/pricing",
"css_selector": "#pricing-table",
"ignore_selectors": [".timestamp", ".ad-banner"],
"threshold_pct": 5,
"alert_mode": "any_change",
"interval_seconds": 3600
}Verify email server connectivity, EHLO handshake, and STARTTLS support
The SMTP monitor opens a TCP connection to your mail server, performs an SMTP EHLO/HELO handshake, optionally upgrades to TLS via STARTTLS, and reports the server capabilities and response time. It does not send an actual email — it only verifies that the mail server is reachable, responding correctly, and supporting the expected encryption mode.
| Field | Type | Required | Description |
|---|---|---|---|
| host | string | Yes | Hostname of the SMTP server (e.g., smtp.example.com, mail.example.com). |
| port | number | No | SMTP port. Default 25. Common: 25 (MTA), 465 (SMTPS), 587 (submission + STARTTLS). |
| ehlo_domain | string | No | Domain to use in the EHLO command. Defaults to monitorion.com. |
| check_starttls | boolean | No | Require STARTTLS support. If the server does not advertise STARTTLS, mark as degraded. Default true on port 587. |
| timeout_ms | number | No | Connection + handshake timeout. Default 10 000 ms. |
| expected_banner | string | No | Substring that must appear in the SMTP banner (220 greeting). Leave empty to accept any valid banner. |
| interval_seconds | number | No | Check frequency. Minimum 60 (Pro). |
| Status | Meaning |
|---|---|
| up | SMTP server is reachable, EHLO succeeded, and STARTTLS is available (if required). |
| degraded | Server is reachable but STARTTLS is not offered, or banner does not match expected_banner. |
| down | Connection refused, timeout, or SMTP protocol error during handshake. |
{
"type": "smtp",
"name": "Postfix Submission Port",
"host": "smtp.example.com",
"port": 587,
"check_starttls": true,
"timeout_ms": 8000,
"interval_seconds": 300
}Verify WebSocket upgrade, connection stability, and optional message round-trip
The WebSocket monitor opens a connection to a WS or WSS endpoint, performs the HTTP Upgrade handshake, and optionally sends a message and validates the server's response. This ensures your real-time infrastructure — live dashboards, chat backends, financial data feeds, multiplayer game servers — is actually accepting and processing WebSocket connections end-to-end.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | WebSocket endpoint URL. Must start with ws:// or wss:// (e.g., wss://realtime.example.com/socket). |
| headers | object | No | Additional HTTP headers sent during the WebSocket upgrade request (e.g., Authorization token). |
| send_message | string | No | Message to send after successful connection. Can be JSON, a heartbeat ping, or any protocol-specific payload. |
| expect_message | string | No | Substring that must appear in the server's response message. Alert if absent or no response received. |
| expect_message_timeout_ms | number | No | Time to wait for a response after sending send_message. Default 5 000 ms. |
| timeout_ms | number | No | Total check timeout including connection + message round-trip. Default 10 000 ms. |
| interval_seconds | number | No | Check frequency. Minimum 60 (Pro). |
| Status | Meaning |
|---|---|
| connected | WebSocket upgrade succeeded. If send_message is set, response was received and matched expect_message. |
| no_response | Connection established but no response received within expect_message_timeout_ms. |
| mismatch | Response received but expect_message not found in payload. |
| failed | WebSocket upgrade was rejected, connection refused, or TLS handshake failed. |
| timeout | Total check timeout exceeded before connection or message round-trip completed. |
{
"type": "websocket",
"name": "Realtime Dashboard Feed",
"url": "wss://realtime.example.com/socket",
"headers": {
"Authorization": "Bearer health-check-token"
},
"send_message": "{"type":"ping"}",
"expect_message": "pong",
"expect_message_timeout_ms": 3000,
"timeout_ms": 8000,
"interval_seconds": 60
}Crawl a page and surface all 4xx / 5xx links automatically
The Broken Links monitor fetches an HTML page, extracts every anchor, image, stylesheet, and script URL, and performs a HEAD request against each one. Any resource returning a 4xx or 5xx status code is reported as broken. The result is a prioritised list of broken resources grouped by type, ready to share with your content or development team.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL of the page to crawl (not a full-site crawl — single page only per monitor). |
| check_external | boolean | No | Also check links pointing to external domains. Default true. Disable to focus on internal links only. |
| ignore_patterns | string[] | No | Array of URL substrings or regex patterns to skip (e.g., "mailto:", "tel:", "#fragment"). |
| timeout_ms | number | No | Timeout per individual link check. Default 10 000 ms. |
| max_links | number | No | Maximum number of links to check per run. Default 200. Pages with more links will be sampled. |
| follow_redirects | boolean | No | Follow redirects before recording status. Default true. Report the final status code. |
| interval_seconds | number | No | How often to recrawl. Default 86 400 (daily). Minimum 3 600 (Pro). |
| Status | Meaning |
|---|---|
| all_ok | Every checked link returned a 2xx or 3xx response. |
| broken_found | One or more links returned 4xx or 5xx. Alert lists each broken URL and its status code. |
| partial | Some links timed out or returned ambiguous responses. Manual review recommended. |
Send a query to your GraphQL endpoint and assert the response
The GraphQL monitor sends a configurable GraphQL query (or mutation) to an endpoint and validates that the response does not contain errors and optionally matches expected data values using JSONPath assertions. This enables deep health-checking of your GraphQL API beyond a basic HTTP 200 check — verifying that resolvers are functioning correctly end-to-end.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | GraphQL endpoint URL (e.g., https://api.example.com/graphql). Must accept POST requests. |
| query | string | Yes | GraphQL query or mutation string. Use introspection-safe queries for health checks. |
| variables | object | No | GraphQL variables object passed alongside the query. |
| headers | object | No | HTTP headers (e.g., Authorization for authenticated endpoints). |
| assert_no_errors | boolean | No | Fail if the response contains an "errors" key. Default true. |
| assert_jsonpath | string | No | JSONPath expression that must resolve to a non-null, non-empty value (e.g., $.data.users[0].id). |
| assert_value | string | No | Expected string value at assert_jsonpath. Alert if value does not match. |
| timeout_ms | number | No | Request timeout. Default 10 000 ms. |
| interval_seconds | number | No | Check frequency. Minimum 60 (Pro). |
| Status | Meaning |
|---|---|
| healthy | HTTP 200, no errors field, and all JSONPath assertions passed. |
| resolver_error | HTTP 200 but response contains an "errors" array. GraphQL schema or resolver failure. |
| assertion_failed | JSONPath assertion did not match expected value. |
| http_error | Non-200 HTTP status returned (e.g., 500, 503). Server-level failure. |
| timeout | Request exceeded timeout_ms. Likely a slow or hung resolver. |
{
"type": "graphql",
"name": "Users API Health",
"url": "https://api.example.com/graphql",
"query": "query HealthCheck { users(limit: 1) { id } }",
"headers": {
"Authorization": "Bearer health-token-readonly"
},
"assert_no_errors": true,
"assert_jsonpath": "$.data.users[0].id",
"timeout_ms": 8000,
"interval_seconds": 60
}Fetch sitemap.xml and verify all listed URLs are reachable
The Sitemap monitor fetches your sitemap.xml (or a sitemap index), parses all listed URLs, and performs a HEAD request against each one. Any URL returning 4xx or 5xx is reported as broken. This catch pages that have been deleted, redirected incorrectly, or accidentally set to noindex without being removed from the sitemap — all of which harm SEO.
| Field | Type | Required | Description |
|---|---|---|---|
| sitemap_url | string | Yes | URL of your sitemap (e.g., https://example.com/sitemap.xml or a sitemap index file). |
| max_urls | number | No | Maximum number of URLs to check per run. Default 500. Large sitemaps are sampled evenly. |
| check_images | boolean | No | Also check <image:loc> entries in image sitemaps. Default false. |
| timeout_ms | number | No | Timeout per individual URL check. Default 10 000 ms. |
| follow_redirects | boolean | No | Follow HTTP redirects and record final status code. Default true. |
| interval_seconds | number | No | Crawl frequency. Default 86 400 (daily). Minimum 3 600 (Pro). |
| Status | Meaning |
|---|---|
| all_ok | Sitemap parsed successfully and all checked URLs returned 2xx responses. |
| broken_urls | One or more sitemap URLs returned 4xx or 5xx. Alert lists each broken URL. |
| sitemap_error | Sitemap file could not be fetched (404, 500) or is not valid XML. |
| partial | Some URLs timed out or returned unusual status codes. Partial results available. |
PageSpeed Insights scores for Performance, Accessibility, SEO, and Best Practices
The Lighthouse monitor calls the Google PageSpeed Insights API to run a full Lighthouse audit against your URL and records the four category scores (0–100) plus Core Web Vital metrics (LCP, FID/INP, CLS, FCP, TTFB). Scores are tracked over time so you can correlate deployment events with performance regressions. Alerts fire when any score drops below your configured threshold.
| Metric | Type | Good threshold | What it measures |
|---|---|---|---|
| Performance | Score 0–100 | ≥ 90 | Overall page load speed composite score |
| Accessibility | Score 0–100 | ≥ 90 | ARIA, colour contrast, keyboard navigation |
| Best Practices | Score 0–100 | ≥ 90 | HTTPS, modern APIs, console errors |
| SEO | Score 0–100 | ≥ 90 | Meta tags, crawlability, structured data |
| LCP | Time (ms) | ≤ 2 500 ms | Largest Contentful Paint — main content load |
| INP | Time (ms) | ≤ 200 ms | Interaction to Next Paint — input responsiveness |
| CLS | Score | ≤ 0.1 | Cumulative Layout Shift — visual stability |
| FCP | Time (ms) | ≤ 1 800 ms | First Contentful Paint — first content render |
| TTFB | Time (ms) | ≤ 800 ms | Time to First Byte — server response speed |
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | URL to audit. Must be publicly accessible (PageSpeed API fetches from Google servers). |
| strategy | enum | No | "mobile" (default) or "desktop". Mobile strategy simulates throttled 4G connection. |
| min_performance | number | No | Alert if Performance score drops below this value. Default 70. |
| min_accessibility | number | No | Alert if Accessibility score drops below this value. Default 80. |
| min_seo | number | No | Alert if SEO score drops below this value. Default 80. |
| min_best_practices | number | No | Alert if Best Practices score drops below this value. Default 80. |
| max_lcp_ms | number | No | Alert if LCP exceeds this value in milliseconds. Default 2 500. |
| max_cls | number | No | Alert if CLS exceeds this value. Default 0.25 (poor threshold). |
| interval_seconds | number | No | Audit frequency. Default 86 400 (daily). Audits are expensive; minimum 3 600 on Pro. |
| Status | Meaning |
|---|---|
| good | All scores meet or exceed configured thresholds. All CWV metrics in "Good" range. |
| needs_improvement | One or more scores or CWV metrics are in the "Needs Improvement" range. |
| poor | One or more scores dropped below configured min thresholds or CWV are in "Poor" range. |
| error | PageSpeed API returned an error. Usually transient — retry next check cycle. |
Detect HTTP resources loaded on HTTPS pages that trigger browser warnings
The Mixed Content monitor fetches an HTTPS page and inspects all resource references (images, scripts, stylesheets, iframes, fonts, media) for any that use an insecure http:// URL. Browsers block or warn about mixed content because HTTP resources on HTTPS pages can be intercepted and modified by an attacker. This silently breaks images, fonts, and scripts — degrading user experience and trust indicators.
| Resource Type | Severity | Browser behaviour |
|---|---|---|
| Scripts (JS) | Critical | Blocked by default in all modern browsers |
| Stylesheets (CSS) | Critical | Blocked by default in all modern browsers |
| iframes | Critical | Blocked by default |
| Images | Warning | Shown but browser displays lock icon warning |
| Audio / Video | Warning | Shown but triggers security warning |
| Fonts | Warning | May be shown with warning or blocked in strict mode |
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | HTTPS URL to scan. Must use https:// — the check is only meaningful on secure pages. |
| check_inline | boolean | No | Also scan inline <style> and <script> tags for http:// URLs. Default true. |
| check_css_imports | boolean | No | Follow @import and url() references within stylesheets. Default false (performance intensive). |
| severity_threshold | enum | No | Minimum severity to alert on: "critical" (scripts/stylesheets only) or "any" (includes images/fonts). Default "any". |
| interval_seconds | number | No | Check frequency. Default 3 600 (hourly). Regressions often occur after CMS edits. |
| Status | Meaning |
|---|---|
| clean | No HTTP resources found on the HTTPS page. |
| warning | Passive mixed content found (images, fonts, media) that triggers browser warnings. |
| blocked | Active mixed content found (scripts, stylesheets, iframes) that browsers will block outright. |
| not_https | The configured URL does not use HTTPS — mixed content detection is not applicable. |
{
"type": "mixed_content",
"name": "Homepage Mixed Content",
"url": "https://example.com",
"check_inline": true,
"check_css_imports": false,
"severity_threshold": "any",
"interval_seconds": 3600
}Validate JSONPath assertions against any JSON API response
The JSON API monitor fetches a URL and validates JSONPath assertions against the JSON response body. It catches the common case where an API returns HTTP 200 but the response body contains an error — something a plain HTTP monitor misses entirely.
| Field | Type | Default | Description |
|---|---|---|---|
| url | string | Required | Endpoint URL to check |
| method | string | GET | HTTP method: GET, POST, PUT, DELETE |
| headers | object | {} | Request headers as key/value pairs |
| assertions | array | [] | List of JSONPath assertions to evaluate |
| Op | Meaning | Example |
|---|---|---|
| eq | Equals (loose) | $.status eq "ok" |
| ne | Not equals | $.status ne "error" |
| gt | Greater than | $.users.count gt 0 |
| lt | Less than | $.latency_ms lt 500 |
| contains | String/array contains | $.tags contains "prod" |
| exists | Field exists (not null) | $.data exists |
| not_exists | Field is null/missing | $.error not_exists |
$.data.user.email, array index: $[0].name, and nested arrays: $.items[2].price.Status values
Track redirect hops and alert when chains change
Monitors the full redirect chain from a starting URL. The first check stores the chain as a baseline. Subsequent checks alert if the chain changes — useful for detecting broken redirects, SEO redirect changes, or hijacked URLs.
| Field | Type | Default | Description |
|---|---|---|---|
| url | string | Required | Starting URL to follow redirects from |
| max_redirects | number | 10 | Maximum hops before reporting too many redirects |
| expected_final_url | string | Auto-detected | Expected destination URL (leave blank to use first-check URL) |
| baseline_chain | array | Auto-stored | Stored automatically after first successful check |
Status values
Detect registrar, nameserver, and status flag changes
Monitors WHOIS records for unexpected changes to registrar, nameservers, or domain status flags. Unlike the Domain Expiry monitor (which tracks the expiry date), this monitor alerts on any structural change — catching domain hijacking, accidental transfers, or unauthorised registrar changes.
| Field | Type | Default | Description |
|---|---|---|---|
| domain | string | Required | Domain name to monitor (no https://, no www.) |
| baseline | object | Auto-stored | Registrar, nameservers, and status flags stored after first check |
Status values
Check FTP and FTPS server connectivity and authentication
Checks FTP and FTPS server availability by connecting on the specified port and optionally authenticating. Supports anonymous FTP, authenticated FTP, and FTPS (FTP over TLS).
| Field | Type | Default | Description |
|---|---|---|---|
| host | string | Required | FTP server hostname or IP address |
| port | number | 21 | FTP port (21 = plain, 990 = implicit FTPS) |
| use_ftps | boolean | false | Enable FTPS (FTP over TLS) |
| username | string | anonymous | FTP username — leave blank for anonymous |
| password | string | anonymous@ | FTP password — leave blank for anonymous |
| timeout | number | 10000 | Connection timeout in milliseconds |
Status values
Verify IMAP email receiving server availability
Checks IMAP email server availability and authentication. Complements the existing SMTP monitor — use both to confirm your email stack can send and receive.
| Field | Type | Default | Description |
|---|---|---|---|
| host | string | Required | IMAP server hostname |
| port | number | 993 | 993 = IMAPS (SSL), 143 = STARTTLS |
| username | string | Required | Email account username |
| password | string | Required | Email account password |
| use_ssl | boolean | true | Enable SSL/TLS (recommended) |
| timeout | number | 10000 | Connection timeout in milliseconds |
Status values
Lightweight POP3 email server banner check
Lightweight check that connects to a POP3 server and verifies the +OK banner. Confirms the server is accepting connections on port 110 (plain) or 995 (SSL).
| Field | Type | Default | Description |
|---|---|---|---|
| host | string | Required | POP3 server hostname |
| port | number | 995 | 995 = POP3S (SSL), 110 = plain |
| use_ssl | boolean | true | Enable SSL/TLS |
| timeout | number | 10000 | Connection timeout in milliseconds |
Status values
Simulate login flows, checkouts, and API workflows
Simulates a real user workflow by executing a sequence of HTTP requests — login, browse, checkout, API call. Each step can validate the response before proceeding. Alerts if any step fails. This is the most powerful monitor type for catching broken user flows.
| Field | Type | Default | Description |
|---|---|---|---|
| steps | array | Required | Ordered list of HTTP steps to execute |
| use_cookies | boolean | true | Carry cookies between steps (for session-based flows) |
| timeout | number | 30000 | Per-step timeout in milliseconds |
| Field | Description |
|---|---|
| name | Step label shown in results (e.g. "Login", "View Dashboard") |
| url | URL for this step — supports {{variable}} substitution from previous steps |
| method | GET / POST / PUT / DELETE |
| headers | Request headers as JSON object |
| body | Request body (for POST/PUT) — supports {{variable}} substitution |
| assertions | Array of: status_code, body_contains, body_not_contains, json_path_eq, header_contains |
| extract | Extract values for later steps: [{var: "token", json_path: "$.token"}] |
{{variable}} in URL/headers/body to reference values extracted in earlier steps.Status values
Detect visual changes with pixel-by-pixel comparison
Takes a Puppeteer screenshot of a webpage and compares it pixel-by-pixel against a stored baseline. Alerts when the page changes beyond the configured threshold. Useful for detecting visual regressions, defacements, or unexpected layout changes. No external API needed — runs entirely on your server.
| Field | Type | Default | Description |
|---|---|---|---|
| url | string | Required | URL to screenshot |
| threshold | number | 10 | Percentage change (0–50%) that triggers an alert |
| selector | string | Optional | CSS selector to screenshot a specific element instead of the full page |
| viewport_width | number | 1280 | Browser viewport width in pixels |
| viewport_height | number | 720 | Browser viewport height in pixels |
| full_page | boolean | false | Screenshot the full scrollable page instead of just the viewport |
puppeteer installed on the server (npm install after deploying).Status values
Start with 6 monitor types on the free plan — no credit card needed. Unlock all 25 types with a Pro subscription.