Skip to content

Uptime checks reference

Every fact about uptime checks in one place. To add a check, see Watch a website or port.

If you found CloudViewer-Check/1.0 in your logs

Section titled “If you found CloudViewer-Check/1.0 in your logs”

Requests with this header come from Vaicoa’s uptime checks:

User-Agent: CloudViewer-Check/1.0 (+https://cloudviewer.app/checks)

A user of the app sets up a check against one host to find out whether it answers from the public internet. The app watches infrastructure on Hetzner; the endpoint does not have to be at Hetzner.

What it sendsOne GET request to one path, with no request body, no query string, no cookies, no credentials and no custom headers. A port check only opens a TCP connection. A certificate check only completes a TLS handshake.
How oftenAt most once a minute from each of two networks (every 5 minutes for a free account). A failed attempt is retried once after 5 seconds. At most three redirects are followed.
What is keptThe status code, the latency, whether the connection and certificate were valid, the certificate’s expiry date, and, if one is set, whether a short text appears in the first 64 KiB. The response body and headers are not stored or transmitted.
Platform ceilingAll checks pointed at one IP address together are capped at 60 requests a minute, counted across all teams.

To allow or block it, match the User-Agent header. The source IP addresses are not published and can change, so an IP allow list or block list does not work. A blocked request shows as a failure to the team that set up the check.

If you did not expect these requests or want them to stop, write to support@mitjamartini.com with the host name and a time from your log.

AppPortalWhat it doesNeeds
Web endpointHTTP(S) endpointOne GET request to a path. Passes when the status code is accepted and, if set, the response contains the text. On https it also records when the certificate expires.host; port optional (443 for https, 80 for http)
Port reachableTCP portOpens a TCP connection. For services that do not speak HTTP, such as a database, mail or SSH port.host and port
CertificateTLS certificateCompletes a TLS handshake (TLS 1.2 or newer) and records how many days the certificate has left. Separate from the web check because certificates are also used on ports that do not speak HTTP, such as 993, 5432 or a gRPC service.host and port

Every type records latency and an uptime percentage.

OptionAppPortalDefaultAccepted values
Host (Hostname / Host)yesyes—a hostname or IP address, up to 253 characters; no scheme, port, path or credentials
Portyesyesfrom the scheme for a web endpoint1–65535; required for a port or certificate check
Schemeyesyeshttpshttps or http
Pathyesyes/up to 256 characters; no query string or fragment; a missing leading / is added
Nameyesyesthe hostname
Accepted statusnoyes2xx2xx, 2xx-3xx, or up to four codes such as 200,404; ranges such as 200-299 are refused
Response must containnoyesnoneplain text up to 64 characters, matched in the first 64 KiB; not a pattern
Latency budget (ms)noyesnonea positive number; without a budget there are no latency alerts
Interval (seconds)noyes60; free: 30060–3600; fixed at 300 on a free account
Enablednoyeson
Anchor to a resource (What are you checking?)noyesexternal targeta server, dedicated server, load balancer, floating IP or primary IP of the team, or Something else on the internet
Edit an existing checknoyes
Price and labels of a targetnoyes (Add price, Labels)no price; counts as 0 in costs

The app form reminds you while you type a scheme, a port or a path into the hostname. Below its button it states your plan’s terms, and on a free account the Add check row shows how much of the allowance is used. A check added in the app is an external target.

Any check can be removed in the app (Remove check) or the portal (Remove). Removing the last check in the app also removes its target and frees the slot; in the portal the target stays until you remove it under Monitored Servers.

PlaceWhat it shows
Dashboarda check target is a row like any other: the dot is its current status, the strip one cell per day of history. A failing check is ranked next to your servers and from there reaches the widgets and Siri. There is no separate checks card
Resources → Uptime checksevery target you check, anchored and external, worst status first
Resource detail → Checksfor anchored checks, above the job reports: status dot, latency, uptime % and, for a certificate check, days remaining. Hidden when the resource has no checks
Check detailthe status and since when, the full target, the last error, status code and latency; a heartbeat bar, one cell per interval with the oldest on the left, over 24 hours, 7 days, 30 days or 90 days, with the uptime percentage for that range; From, one row per network with its latency or error; Certificate with the expiry date and Days left
Portal → Uptime Checksevery target with its checks, host, interval and an Edit and Remove per check
Upthe endpoint responded as configured
Downit did not, and the second network confirms it
Mixedour two networks disagree. Shown on screen, never alerted
No dataneither network reported. Grey, never red

No data means Vaicoa has no result, not that your service is down. When our own network is unreachable, or a network has not reported within three check intervals, its result no longer counts. With no network reporting, the check turns grey, not red. It does not send an alert, and those minutes are excluded from the uptime percentage instead of counted as downtime. The heartbeat bar shows them in grey as well.

Every check, on every plan, runs from two independent networks: one inside Hetzner and one outside it, at a different provider. A check is reported Down only when both agree. When they disagree, it is Mixed, which is shown on screen and does not send an alert. This prevents alerts caused by a network problem between one of our locations and your host, and a network outside Hetzner still sees your service when Hetzner’s own network has a bad day.

You don’t choose locations; every plan gets the same two networks.

One consequence: a service that is down from only one of the two networks (because of geo-blocking or a routing problem) shows as Mixed and does not send a push notification. The result is visible on screen.

These alerts need Vaicoa Pro or Vaicoa Team. They use the same push notifications, muting and history as other alerts. On a free account, results are only shown in the app and the portal.

Alert (as the notification says it)SeverityWhen
unreachable from outsidecriticalboth networks agree the check fails. It says “unreachable” rather than “down”, because it can appear next to a resource that Hetzner still reports as running
certificate expiringwarningfewer than 14 days left
certificate expires imminentlycriticalfewer than 3 days left
slower than its budgetwarningover the latency budget for 10 minutes; only when a budget is set

An alert is only sent after both networks agree and the alert rule has evaluated. A real outage reaches your phone within a few minutes, and a single failed probe does not send an alert. Thresholds and timings: Alert rules.

Free accountProTeam
Check targets4, a separate allowanceshare the 20 monitored-server slotsshare the 50 monitored-server slots
Checks per target8, and at most 8 per team in total88
Checked from two independent networksyesyesyes
Interval300 s, fixed60–3600 s60–3600 s
Check history30 days30 days90 days
Alerts (push, email, alert targets)noyesyes
Pause after 60 days without a visityesnono

On a paid plan, one limit covers everything Vaicoa monitors. A check on a server you already monitor uses no extra slot. Only a target that is not already a monitored server uses one: a load balancer, a floating IP or an external endpoint.

A free account has no monitored servers and no connected project, so its four targets are external endpoints you enter: a hostname, a port, a path. It can have 8 checks in total, spread across those targets in any way. The checks run and keep their history, but they do not send alerts.

When a paid plan ends, checks fall back to free terms: the oldest checks on the four oldest targets keep running, at most 8 of them, every 300 seconds, without alerts. The others stay configured but are not run, and nothing is deleted. Plan details: Plans and limits.

A check sends no request body, no custom headers, no cookies and no credentials. It only sends GET requests, and the path cannot contain a query string. The reasons:

  • A check that sends nothing cannot be used to deliver data to a third party. It can only observe that something answered.
  • Check URLs appear in shared briefs and coding-agent hand-offs and in answers from the Claude connector. A ?token=… would appear in all of them, so query strings are not allowed at all. For the same reason a host that contains credentials (token@host) is refused.
  • The body match is a plain substring, not a pattern. It covers the common cases (ok, healthy, a version string) and cannot be used to run expressions on our servers.

For an endpoint that needs a credential, use a job report instead: one curl in a cron line, reported with the server’s agent token. The secret stays on your machine, and you get the same staleness alert as a backup job. See Watch an endpoint that needs a credential.

Response bodies and headers are never stored or transmitted. The substring is matched where the check runs, and only the result (match or no match) is sent back. Failures are recorded as one of a fixed set of reasons, never as free text.

A check makes at most one request a minute from each network and sends no payload, so it cannot be used as a scanner or a load test. Only check endpoints you are authorized to test.

The app showsMeaning
Name did not resolvethe DNS lookup failed
Connection refusedthe host answered, but nothing accepts connections on that port
Timed outno answer within the time limit
TLS handshake failedthe TLS connection could not be set up
Certificate expiredthe certificate’s end date has passed
Certificate not trustedthe certificate chain is not trusted or does not match the host name
Unexpected status codethe HTTP status is not one of the accepted ones
Response did not matchthe text was not found in the first 64 KiB
Too many redirectsmore than three redirects
Address cannot be checkedthe name resolves to a blocked address (see below)
Check could not runthe check failed on Vaicoa’s side, not on yours
  • 8 checks per target. On a paid plan, a target uses one of your monitored-server slots. A free account has two limits of its own: four targets, and 8 checks in total across them. The second limit is the one that matters, because every check has its own hostname. A target is a way to group checks, not the thing being checked.
  • Interval: 60 seconds minimum, 3600 s maximum, 60 s default. A free account runs at a fixed 300 s. A shorter interval is not available on any plan.
  • Timeout: 10 seconds per attempt, of which at most 5 seconds to open the connection. A failed attempt is retried once after 5 seconds, so a single lost packet is not a failure.
  • Host up to 253 characters. Path up to 256 characters, no query string. Substring up to 64 characters, matched in the first 64 KiB. At most four explicit status codes. At most three redirects, each checked against the blocked ranges again.
  • 60 requests per minute against any one address, counted across all teams on the platform, and 600 per minute against one network (a /24 for IPv4, a /48 for IPv6). You only reach this by pointing many checks at the same host. The portal refuses a check that would go over, and says why.
  • A free account’s checks pause after 60 days without a visit. If nobody on the team uses the app or the portal for 60 days, the checks stop running and the history shows that time as no data, not as downtime. Your next visit starts them again within a minute or two, and the app and the portal then say when the checks were paused and why, until that gap has left the 30-day history. Paid plans never pause.

A check cannot target an address in these ranges. The portal refuses it when you save, with the reason, and every connection is checked again immediately before it is made, including each redirect. A name that resolves to a public and a blocked address is refused as a whole. An IPv4 address written in IPv6 form is judged as the IPv4 address.

RangeExamples
Private10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, IPv6 unique local fc00::/7
Loopback127.0.0.0/8, ::1
Link-local169.254.0.0/16, fe80::/10
Cloud metadata service169.254.169.254
Carrier-grade NAT100.64.0.0/10
Tunnels and translation6to4 2002::/16, Teredo 2001::/32, local-use NAT64 64:ff9b:1::/48
Documentation and benchmark192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24, 2001:db8::/32, 198.18.0.0/15
Other special-purposemulticast, broadcast, unspecified, reserved (240.0.0.0/4), 192.0.0.0/24, discard-only 100::/64
Vaicoa’s own network

To watch an internal endpoint, curl it from a cron job on a machine that can reach it and send the result as a job report.