Target
{% if not monitor %}
Type {% for k, v in modes.items() %}{{ v[0] }} · {{ v[1] }} {% endfor %}
{% endif %}
Name {% if mode not in ('heartbeat',) %}(optional) {% endif %}
{% if mode in ('uptime','api','text','price','keyword','health') %}
URL
{% elif mode == 'tcp' %}
{% elif mode == 'domain' %}
Domain expiry alert (days before)
Alert on changes to (none selected = every record type)
{% for t in ['A','AAAA','MX','NS','TXT','CNAME'] %}
{{ t }}{% endfor %}
Tip: untick TXT if a service rotates verification records; MX and NS changes are the ones that hijack email and traffic.
{% elif mode == 'dependency' %}
Provider
{% for slug, p in providers.items() %}{{ p[0] }} {% endfor %}
Custom status page URL…
A major or critical incident at the provider marks this monitor down and opens an incident, so your status page can say "third-party issue" instead of "we're broken". Minor issues send a heads-up only.
{% elif mode == 'heartbeat' %}
Your job calls a unique URL when it finishes. If the ping doesn't arrive in time, we alert you. Optionally call /start first to track run duration, and POST the job's output to keep logs.
Schedule
Fixed period Cron expression
{% elif mode == 'flow' %}
Steps run in order. Extract values from a response with json:path, header:name or regex:pattern, then use them anywhere later as {{ '{{' }}name{{ '}}' }}. The flow fails at the first failing step.
+ Add step Edit as JSON
Fields per step: name, method, url, headers, body, expect_status, assertions (one per line), extract, max_latency_ms.
{% endif %}
{% if mode == 'api' %}
Method {% for mth in ['GET','POST','PUT','PATCH','DELETE','HEAD'] %}{{ mth }} {% endfor %}
Request headers (optional) One per line as Name: value, or a JSON object. Use read-only test credentials.
Request body (optional)
Assertions (optional, one per line)
contains text · not_contains text · json path exists · json path == value (also != < > <= >= contains) · header name contains text
{% endif %}
{% if mode == 'health' %}
Extra request headers (optional)
{% endif %}
{% if mode in ('text','price','keyword') %}
{% endif %}
{% if mode == 'price' %}
Alert when the value…
changes at all
drops below a threshold
rises above a threshold
moves by at least a percentage
{% endif %}
{% if mode == 'keyword' %}
Alert when it…
appears on the page disappears from the page
{% endif %}
{% if mode in ('uptime','api','text','price','keyword','tcp','health') %}
Check from {% if plan.private_locations == 0 %}Pro {% endif %}
Vigil cloud (public internet) {% for ag in agents %}Private location: {{ ag.name }} {% endfor %}
Private locations run the check from an agent inside your network or another region.
Manage locations .
{% endif %}
Schedule, thresholds & alerts
{% if mode != 'heartbeat' %}
Check frequency
{% for mi, label in interval_choices %}
{{ label }}{% if mi < plan.min_interval %} (upgrade){% endif %}
{% endfor %}
{% if mode == 'domain' %}
Domain monitors run at most every 30 minutes; the expiry lookup happens twice a day.
{% endif %}
{% endif %}
{% if mode in ('uptime','api','text','price','keyword','health','flow') %}
{% if mode != 'flow' %}
{% endif %}
{% if mode != 'flow' %}
{% endif %}
{% endif %}
{% if mode in ('uptime','api','text','price','keyword','health','flow','tcp') %}
{% endif %}
{% if mode != 'heartbeat' %}
{% endif %}
Send alerts to
{% if channels %}
{% for c in channels %}
{{ c.name }} {{ c.kind }} {% endfor %}
{% if smtp_enabled %}Nothing selected → we'll email {{ ws.email }}.{% else %}With none selected, alerts only appear in this dashboard.{% endif %}
{% else %}
{% endif %}
{% if plan.escalation and channels %}
Escalation channels {% for c in channels %} {{ c.name }} {{ c.kind }} {% endfor %}
{% endif %}
{% if monitor %}Save changes{% else %}Create monitor{% endif %}
Cancel