v5.0
live available
devtools comparison 05 Sept 2026

Eight uptime monitors compared on catching a 200 that is lying

A serverless function that was never deployed answered 200 with the app shell. Here is what each free tier lets you assert on the response body, and what the first paid dollar actually buys.

By Purvansh Parmar Checked 2026-09-05 Read 8 min Entries 8

A health check that only asserts 200 is not a health check. On a SPA host the fallback rule catches every unmatched path, so a deleted API route answers 200 with your index.html and the monitor stays green. I hit exactly that this morning. The question for a monitoring tool is therefore not how fast it polls, but whether the free tier will let you assert on the body it got back, and the answer split these eight in a way I did not expect.

How this was checkedOn 5 September 2026 I curled a Netlify function path that has never existed, /.netlify/functions/definitely-not-a-function, expecting a 404. It returned 200, content type text/html, 6165 bytes: the SPA fallback rule /* /index.html 200 had served the app shell instead. A path with a real function behind it returned 405 and JSON on the same request. Every status-code-only check I would have written against that endpoint would have stayed green through a function that was never deployed at all.

What I compared on

01 UptimeRobot

The default free uptime monitor: 50 checks, one string per check, five minutes apart.

Free
50 monitors at a 5 minute interval, with keyword monitors included rather than held back, so you can assert that a string is present or absent in the response body without paying anything.
Paid
Solo is $9 a month. It does not add assertion types. What it buys is the 60 second interval and the Slack, Telegram and Microsoft Teams integrations.
Wins
You have a lot of endpoints, you want a body assertion on all of them, and a 5 minute detection window is acceptable. Nothing else gives 50 free monitors with keyword checks.
Loses
The assertion is one string, present or absent. There is no response time condition and no JSON path, so if the string you match on also appears in your fallback page, the check is decorative.
50 free monitors5 min free interval$9/mo for 60s

02 Better Stack

Uptime plus incident management, with keyword checks on the free tier and the fast interval behind the paywall.

Free
10 monitors and heartbeats at a 3 minute interval, HTTP keyword checks, Slack and email alerts, and one status page. The keyword check is the part you might expect to pay for and it is here at zero.
Paid
$25 a month per block of 50 additional monitors. That block is also where the 30 second interval, unlimited SMS and unlimited phone call alerts live.
Wins
You want a body assertion, a status page and an on-call escalation from one vendor, and ten monitors covers everything you run.
Loses
Ten monitors goes fast once you check each service and each region separately, and the next step up is $25 a month for fifty more, so there is nothing on offer between 10 and 60.
10 free monitors3 min free interval30s on paid$25/mo per 50 monitors

03 StatusCake

Ten free tests with basic string matching, and a paid step that is mostly about the interval.

Free
10 uptime tests at a 5 minute interval, with basic content matching on the response body, plus alerts by email and through integrations.
Paid
Superior is $24.49 a month billed monthly, or $20.41 a month billed annually. It raises the test count to 100 and the floor interval to 1 minute.
Wins
You want the same shape as UptimeRobot from a different vendor, and the page speed, domain and SSL checks alongside are worth something to you.
Loses
The free floor is 5 minutes and the match is one basic string, with no structured assertion. Getting to 1 minute costs $24.49 a month, which is more than Checkly charges for a plan that can drive a browser.
10 free tests5 min free interval$24.49/mo monthly1 min on paid

04 Checkly

Monitoring as code: Playwright scripts and real assertions, metered by check run rather than by monitor.

Free
Hobby gives 10,000 API check runs and 1,000 browser check runs a month, a 2 minute minimum frequency, 7 days of raw data and 30 days aggregated. It is hard capped, so when the quota is gone the checks stop.
Paid
Starter is $24 a month for 25,000 API runs, 3,000 browser runs and a 1 minute floor, with overage at $2.60 per 10,000 API runs and $6.50 per 1,000 browser runs.
Wins
The check needs to be a program: log in, follow the redirect, assert on a JSON path, then assert the response came back in under a second. Nothing else here expresses that.
Loses
10,000 free API runs a month is one check every 4.3 minutes and nothing else. Add a second endpoint and you are either at 8.6 minute coverage or on the $24 plan, so the free tier is a trial rather than a home.
10,000 API runs/mo free1,000 browser runs2 min free floor$24/mo Starter

05 Cronitor

The best assertion vocabulary on this list: status, body contains, JSON path, headers, response time, SSL.

Free
Hacker gives 5 monitors at a 5 minute interval with email and Slack alerts. The assertion syntax is the one paying customers get, so response.body contains "healthy" and response.json data.status = "active" both work at zero.
Paid
Business is $2 per monitor per month plus $5 per user per month, which unlocks the 30 second interval and all 11 alert integrations. Enterprise starts at $6,000 a year.
Wins
You want to assert on a JSON field instead of grepping a whole page, and you would rather pay per monitor than buy a block of fifty you will not fill.
Loses
5 free monitors is the smallest allowance here, and the per-user fee stacks on top, so a three person team pays $15 a month before it has monitored a single endpoint.
5 free monitors5 min free interval$2/monitor/mo$5/user/mo30s on paid

06 updown.io

Pay per check, no plans at all. String matching is included and the arithmetic is small enough to do by hand.

Free
There is no free plan. New accounts get 100,000 credits and one credit is one check, so a single monitor at a 1 minute interval burns 1,440 a day and the signup grant lasts about 69 days.
Paid
200,000 credits for 5 euro, scaling to 10,000,000 for 100 euro. A 1 minute check runs 43,200 times in a 30 day month, so one monitor is about 1.08 euro at the small package and about 0.43 euro at the large one. An SMS is 7,500 credits, roughly 0.10 euro.
Wins
You want a fast interval on a handful of endpoints without buying a plan sized for fifty. At a 30 second interval one monitor works out at about 2.16 euro a month.
Loses
No plan also means no free tier, and once the signup credits are spent you are topping up a balance that stops monitoring at zero rather than degrading. Text search is a substring match, not a structured assertion.
100,000 signup credits5 euro per 200,000 checks1.08 euro/mo at 60s0.10 euro per SMS

07 Healthchecks.io

The inverse design: it never calls your URL, your code calls it, and silence is what raises the alert.

Free
20 checks with 100 log entries each, free forever, and no polling of your endpoints at all. Your cron job or worker pings a URL when it finishes, and the absence of that ping inside the window is the incident.
Paid
Supporter is $5 a month with identical limits, which is a donation rather than an upgrade. Business is $20 a month for 100 checks and 1,000 log entries with SMS, WhatsApp and phone credits. Business Plus is $80 a month for 1,000 checks.
Wins
What you are actually afraid of is a batch job that quietly stopped running. A poller cannot see that failure at all, because there is no URL to poll.
Loses
It cannot check an endpoint. If your API serves the SPA fallback while a cron still pings on schedule, this reports healthy, so it answers a different question than the one at the top of this post.
20 free checks100 log entries per check$5/mo Supporter$20/mo Business

08 Uptime Kuma

Self-hosted, MIT licensed, and the only entry here that gives you a JSON query assertion for nothing.

Free
All of it. HTTP keyword and HTTP JSON query monitor types, a 20 second minimum interval, over 90 notification integrations, and no cap on monitors. Version 2.5.0 landed on 1 August 2026 and added an NTP monitor.
Paid
There is nothing to buy, but the bill is real: a 1 GB VPS at roughly $5 a month, plus you patching it, watching its disk and backing up its database.
Wins
You already run a small box and want unlimited monitors with JSON assertions at a 20 second interval for the price of the box.
Loses
It runs in one place, adn that place is often the same provider as the thing it watches. A regional outage takes down the service and the monitor together, and nobody gets paged.
20s minimum interval90+ notification integrationsabout $5/mo for the VPSv2.5.0 on 2026-08-01

Side by side

FreePaid fromBody assertion on free
UptimeRobot50 monitors, 5 min$9/mo for 60skeyword, one string
Better Stack10 monitors, 3 min$25/mo per 50 monitorskeyword
StatusCake10 tests, 5 min$24.49/mo for 1 minbasic string match
Checkly10k API runs/mo, 2 min$24/mo Starterfull, incl. JSON path
Cronitor5 monitors, 5 min$2/monitor/mofull, incl. JSON path
updown.io100k signup credits5 euro per 200k checkstext search
Healthchecks.io20 checks$5/monone, it does not poll
Uptime Kumaunlimited, 20syour VPS, about $5/mokeyword and JSON query

Verdict

Better Stack. Ten free monitors with keyword checks at a 3 minute interval is the most assertion anyone gives away, and a 3 minute detection window on a health endpoint is not what will hurt you. If the endpoint earns money, move to Cronitor at $2 a monitor and write the check as response.json data.db = "ok", because a string match against a page you also serve as a fallback is exactly how you end up with a green dashboard over a dead API. Skip Checkly unless the check genuinely needs a browser: 10,000 free API runs is one endpoint every 4.3 minutes, and no second endpoint.

Sources