HTTP & keyword monitors
Every HTTP and website monitor setting in SutramX: URL, method, headers, auth, status codes, keywords, timeouts, redirects, TLS and bot protection.
A website monitor (Website (is the page up?) in the type list) requests a URL from each of your check locations and decides whether the response is healthy. Out of the box it checks that the site answers with the expected status code. You can add keyword checks, header rules, response-time limits and more under Show advanced options.
API monitors use the same request and validation settings, plus a request body and assertions. They are covered in API & multi-step checks. Everything on this page applies to them too.
Create an HTTP monitor#
- Go to Monitors → New monitor.
- Keep What do you want to check? set to Website (is the page up?).
- Enter the URL, for example
https://example.com/health, and optionally a Name. A blank name becomes the host name. - Choose a Check interval.
- Optionally click Show advanced options to add keyword checks, headers or limits.
- Click Test to try it, then Create monitor.
SutramX also looks at the page once and can suggest related checks, such as the checkout or login page. Nothing is added unless you tick it. See Site detection and suggested checks.
If you type a bare host name such as example.com, the dashboard adds https://. The scheme and host are lower-cased; the path and query string keep their case.
Guided presets#
The Guided preset list fills in sensible advanced settings in one click. It appears in the Add new monitor dialog when you choose API endpoint. The dialog lists exactly what it changed.
| Preset | What it sets |
|---|---|
| JSON API — strict API contract checks | Keeps API endpoint, GET, status 200, header content-type: application/json, forbidden keywords Fatal error:, Stack trace:, Traceback (most recent call last), max response time 1500 ms, timeout 15 s, 2 redirects, 2048 KB, failure threshold 2 |
| Website HTML — page uptime and latency | Switches to Website (is the page up?), status 200, 301, 302, header content-type: text/html, forbidden keywords Fatal error:, Stack trace:, Traceback (most recent call last), max response time 2500 ms, timeout 20 s, 5 redirects, 2048 KB, failure threshold 2 |
| Webhook endpoint — fast POST acceptance | Keeps API endpoint, POST, status 200, 201, 202, 204, header cache-control: no-store, forbidden keywords Fatal error:, Stack trace:, Traceback (most recent call last), max response time 2000 ms, timeout 20 s, no redirects, 2048 KB, failure threshold 1 |
You can change any value after applying a preset.
Request settings#
| Field | What it does | Default / limits |
|---|---|---|
| URL | The address to request | Required. Must be a full http:// or https:// URL to a public host |
| Method | HTTP method. For website monitors it's under Show advanced options | GET. GET, POST, PUT, PATCH, DELETE, HEAD or OPTIONS |
| Authentication | Adds an Authorization header | None, Bearer token or Basic auth (username and password) |
| Request headers | Extra headers sent with every check, for example a secret header your firewall allowlists | Up to 50 headers |
| Timeout (seconds) | How long to wait for the full response | 1–60 s. The dashboard starts at 30 s; if you create a monitor through the API without a timeout, 10 s is used. Always capped at the interval minus 3 s; the editor shows the effective value |
| Max redirects | How many redirects to follow | 0–5, default 5. With 0, a redirect response fails the check |
| Max response size (KB) | How much of the body is downloaded for keyword and body checks. A larger page is still checked for status and speed | 1–10,240 KB (10 MB). Default 2,048 KB (2 MB) |
| Fail if the HTTPS certificate is invalid or expired | Rejects invalid, expired, self-signed or mismatched certificates | On |
Headers you can't set. Host, Content-Length, Transfer-Encoding, Connection, Upgrade, Proxy-Authorization and Proxy-Connection are controlled by SutramX and are dropped if you add them.
Headers on redirects. When a redirect leads to a different scheme, host or port, SutramX only forwards User-Agent, Accept, Accept-Language and Accept-Encoding. Your auth and custom headers are dropped so a secret never reaches another site. A redirect from HTTPS to plain HTTP is refused when you send custom headers.
Default request headers#
Unless you set your own, every check sends:
User-Agent: Mozilla/5.0 (compatible; SutramX-Monitor/1.0; +https://sutramx.com/bot)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9Adding a header with the same name (in any letter case) replaces the default.
Validation settings#
A response must pass every rule you set. They are checked in this order, and the first failure is what you see in the check history and alerts.
| Field | What it does | Default / limits |
|---|---|---|
| Expected status codes | Status codes that count as success. Comma-separated codes or ranges, such as 200, 204 or 200-299 | The dashboard starts with 200. If empty, any status below 400 passes. Codes 100–599; ranges count as every code they cover, up to 500 codes |
| Required keyword | Text the response body must contain | Case-sensitive. Up to 1,000 characters |
| Ignore letter case | Makes the required keyword case-insensitive | Off |
| Forbidden keywords | Comma-separated text that must not appear in the body. Catches error pages served with a 200 | Case-sensitive |
| Expected response headers | One rule per line as Header: value. The header must exist and contain the value | Header name and value are case-insensitive |
| Max response time (ms) | Slower responses fail the check | Off. 1–600,000 ms |
| Degraded above (ms) | Slower responses show as Degraded without failing or opening an incident | Off. 1–600,000 ms, and lower than the max response time |
Keywords are matched against the raw response body, including HTML markup. A HEAD request has no body, so don't combine HEAD with keyword checks.
The status code checked is the one from the final response, after redirects are followed.
Alert thresholds#
| Field | What it does | Default / limits |
|---|---|---|
| Failure threshold | Consecutive failed checks before alerting | 1 (1–10) |
| Recovery threshold | Consecutive passing checks before the incident resolves | 1 (1–10) |
Under Detection in the same advanced options:
| Field | What it does | Default / limits |
|---|---|---|
| Confirmation period (seconds) | A failure must last this long in a location before an incident opens | Blank uses the default: 30–60 s for new monitors checked every minute or faster, otherwise 0. 0–3,600 s |
| Recovery period (seconds) | The monitor must stay up this long before the incident resolves; any failure restarts it | Blank uses the default: 60 s for new monitors checked every minute or faster, otherwise 0. 0–3,600 s |
| IP version | Which addresses of the host the checker connects to | Automatic (IPv4 first, then IPv6), IPv4 only or IPv6 only |
These work together with multi-location confirmation. See Regions & confirmation.
Choose which errors alert#
In the monitor editor (Edit), expand Alert on these HTTP errors. Every failure has an error class, such as Status 5xx, Timeout Connect or Keyword Not Found. Untick a class to stop it from sending notifications. The check is still recorded as failed; it just doesn't notify anyone. Use Select all or None to change them all.
Error types#
Each failure is tagged with one error class. The editor shows them in readable form (for example timeout_connect appears as Timeout Connect); the API uses the ids below.
| Error class id | When it happens |
|---|---|
status_4xx / status_5xx | No expected status codes are set and the server answered 400–599 |
rate_limited | The server answered a plain 429 that you don't expect. Shown as Blocked, not counted as downtime, and the next check waits for the server's Retry-After |
status_unexpected | The status isn't in your expected status codes |
keyword_not_found | The required keyword is missing |
invalid_response_body | A forbidden keyword was found, an expected header is missing or wrong, or an API assertion failed |
response_time_exceeded | Slower than Max response time |
response_too_large | The body is bigger than Max response size and a keyword, forbidden keyword or body assertion needs the whole body to decide. Without such rules, a large page is checked for status and speed only |
timeout_connect / timeout_read / timeout_total | No connection, no complete response, or the whole request ran out of time. The message includes the timeout actually applied |
connection_refused / connection_reset | The server refused or dropped the connection |
network_unreachable | There is no network route to the host |
dns_resolution_failed | The host name didn't resolve |
redirect_loop | More redirects than Max redirects allows |
redirects_disabled | Max redirects is 0 and the server redirected |
insecure_redirect | A redirect from HTTPS to plain HTTP was refused because the request carries custom headers |
ssl_expired / ssl_hostname_mismatch / ssl_self_signed / ssl_revoked / ssl_untrusted_chain / ssl_not_yet_valid | Certificate problems, when Fail if the HTTPS certificate is invalid or expired is on |
blocked_target | The target resolves to a non-public address and can't be monitored |
blocked_by_bot_protection | The site's firewall refused the check (see below) |
checker_error | A problem on SutramX's side, not your site's. The check is Inconclusive and never opens an incident on its own |
Bot protection and firewalls#
Firewalls and bot filters (Cloudflare, Vercel, AWS WAF, Akamai, Imperva, Sucuri, DataDome, Kasada and similar) sometimes block monitoring traffic. When that happens the site may be perfectly healthy, but the check can't tell.
SutramX recognises these blocks instead of reporting them as an outage. A response with status 403, 429 or 503 that carries a vendor-specific header or a vendor's block-page text is classified as Blocked by bot protection (WAF), with a message like:
Blocked by Cloudflare bot protection (HTTP 403) — the target refused the check, so its availability could not be verified. Allowlist the checker in the target's firewall: https://sutramx.com/botDetection is deliberately conservative. A plain 403 from a site behind Cloudflare is still reported as a normal 403, because many APIs return real 403s. A 401 is never treated as a block. A plain 429 without a vendor marker is reported as Rate limited (HTTP 429) instead. Neither a block nor a rate limit counts as downtime. If you set expected status codes that include the blocking status, the check passes.
To fix a block:
- Allowlist SutramX in your firewall. The user agent and checker IP addresses are listed at https://sutramx.com/bot.
- Or add a secret request header (for example
X-Monitor-Token) under Request headers and allow requests that carry it. - If you'd rather not be notified about blocks, untick Blocked by bot protection (WAF) under Alert on these HTTP errors.
Example: create through the API#
The API takes the same settings in config. Times are in milliseconds and sizes in bytes.
curl -X POST "https://api.sutramx.com/monitors" \
-H "Authorization: Bearer sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Checkout page",
"type": "http",
"url": "https://shop.example.com/checkout",
"interval_seconds": 60,
"config": {
"method": "GET",
"headers": { "X-Monitor-Token": "s3cret" },
"expected_status_codes": [200],
"keyword": "Place order",
"keyword_case_insensitive": true,
"forbidden_keywords": ["Internal Server Error"],
"expected_response_headers": [{ "name": "content-type", "value": "text/html" }],
"timeout": 15000,
"max_redirects": 3,
"max_response_bytes": 1048576,
"max_response_time_ms": 3000,
"degraded_response_time_ms": 1500,
"failure_threshold": 2,
"recovery_threshold": 1,
"verify_tls": true
}
}'| Config key | Dashboard field | Limits |
|---|---|---|
method | Method | GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS |
headers | Request headers / Authentication | Object, up to 50 entries |
timeout | Timeout | 1000–60000 ms |
max_redirects | Max redirects | 0–5 |
max_response_bytes | Max response size | 1–10485760 bytes |
expected_status_codes | Expected status codes | Array of up to 500 codes |
keyword | Required keyword | Up to 1,000 characters |
keyword_case_insensitive | Ignore letter case | true / false |
forbidden_keywords | Forbidden keywords | Array of strings |
expected_response_headers | Expected response headers | Array of { "name", "value" } |
max_response_time_ms | Max response time | 1–600000 ms |
degraded_response_time_ms | Degraded above | 1–600000 ms, lower than max_response_time_ms |
failure_threshold / recovery_threshold | Failure / Recovery threshold | 1–10 |
verify_tls | Fail if the HTTPS certificate is invalid or expired | true / false |
confirmation_seconds / recovery_seconds | Confirmation period / Recovery period | 0–3600 |
ip_family | IP version | auto, ipv4 or ipv6 |
alert_on_error_types / ignore_error_types | Alert on these HTTP errors | Lists of error class ids, such as status_5xx |
The whole config object can have at most 50 keys and 32 KB when serialized.
Troubleshooting#
The check times out but the site loads in my browser. The response time includes DNS, connecting, TLS, redirects and downloading the full body. Raise Timeout, and remember it is capped at the interval minus 3 s. The error message shows the timeout actually used.
"Response body is larger than the … byte limit, so keyword/body checks could not run". The page is bigger than Max response size and a keyword or body rule needs the whole page. Raise the size (up to 10 MB), remove the body rule, or check a lighter health endpoint.
Keyword not found, but I can see the text on the page. The keyword is matched against the HTML the server returns, not what JavaScript renders afterwards, and it is case-sensitive unless Ignore letter case is on. HTML entities (such as &) are not decoded.
A 301 or 302 fails my check. Redirects are followed by default, so you normally see the final status. If Max redirects is 0, the redirect itself fails the check. Add the redirect status to Expected status codes if you want to monitor the redirect.
Self-signed or internal certificates. Untick Fail if the HTTPS certificate is invalid or expired. The host still has to be publicly reachable.
"Target resolves to a non-public address". SutramX only checks public hosts. Private IPs, localhost and internal names can't be monitored.
Related
- Site detection and suggested checks
- API & multi-step checks
- SSL & domain expiry
- Regions & confirmation
- Monitors overview
- Troubleshooting
- Features: Uptime Monitoring
- Guides: Why Is My Website Down?, How to Fix 502 Bad Gateway, How to Fix 503 Service Unavailable, How to Fix 504 Gateway Timeout and Why Your Monitor Reports 403 While Your Site Works
- Free tools: HTTP Status Code Reference and Website Uptime Checker
- Use cases: Monitoring for E-Commerce
Last updated . Something unclear or missing on this page? Tell us at support@sutramx.com.