01
Any HTTP method
Test the exact request your app makes — GET, POST, PUT, PATCH, DELETE, HEAD or OPTIONS — not an approximation of it. If your integration only ever calls your API with a POST and a specific content type, that's what gets checked, not a generic GET that happens to hit the same URL and tells you nothing about whether the real request path actually works. That precision is what separates monitoring that reflects reality from monitoring that just gives you a comforting green checkmark. There's no need to settle for testing a nearby GET endpoint as a stand-in for the request that actually matters.
02
Real assertions
Check status code and keyword/body-match together, so a 200 with the wrong payload still counts as down. A broken deploy that returns a 200 with an empty JSON body, a stale cache, or an error message wrapped in a success response would sail past a status-code-only check — this catches it because the response body has to actually look right, not just arrive with the right number attached. It's a small addition to set up and a large one to actually catch. It's the sort of failure mode that a status-code-only tool is structurally incapable of ever catching.
03
Custom headers & body
Send auth tokens, content-type, and a JSON payload — whatever the endpoint actually expects to receive. That means monitoring an authenticated internal API the same way your own services call it, instead of only being able to watch the handful of public, unauthenticated endpoints a simpler tool is limited to. That flexibility is what makes it useful for more than a handful of simple public-facing checks. Nothing about the request has to be simplified or approximated just to fit what the monitor supports.