"Shouldn't we add synthetic monitoring?" someone asks in the incident review. But you already have uptime monitoring. Are they the same thing? Not quite — and understanding the difference saves you from buying tools you don't need or missing coverage you do.
Uptime monitoring: is it up or down?
Uptime monitoring answers the most fundamental question: can users reach your service right now? It sends HTTP requests to your endpoints on a schedule — every 10 to 60 seconds — and checks the response.
A typical uptime check verifies:
- The endpoint returns a 2xx status code
- The response time is under an acceptable threshold
- The response body contains expected content
- Required headers are present
If any assertion fails consecutively (usually 2-3 times to avoid false positives), an alert fires. That's it. Simple, fast, reliable. It covers the 80% case: your service is either reachable or it isn't.
Synthetic monitoring: does the user journey work?
Synthetic monitoring goes further. Instead of checking a single endpoint, it simulates an entire user workflow — a scripted sequence of actions that mimics what a real user would do.
A synthetic test for an e-commerce site might:
- Load the homepage
- Search for a product
- Add it to the cart
- Enter shipping details
- Complete the checkout
Each step is timed and validated. The test runs in a real browser (or headless browser), executing JavaScript, rendering CSS, waiting for network requests. It catches problems that a simple HTTP check never would — a broken checkout button, a JavaScript error that prevents form submission, a third-party script that blocks page load.
When uptime monitoring is enough
For most APIs, microservices, and backend services, uptime monitoring covers what you need:
- REST/GraphQL APIs — Check that endpoints return correct status codes and response shapes. Add JSON path assertions for critical fields.
- Health check endpoints — Verify that
/healthreports all dependencies as connected. - Webhooks and integrations — Confirm that callback URLs are reachable and responding.
- Static sites and CDNs — Verify content is being served and response times are acceptable.
If your service exposes an API and your users interact with it programmatically, uptime monitoring with smart assertions is all you need. You don't need a browser to check an API.
When you need synthetic monitoring
Synthetic monitoring earns its complexity when the user experience depends on client-side behavior:
- E-commerce checkout flows — The API might be fine but a JavaScript bundle fails to load, breaking the "Buy" button.
- Single-page applications — SPAs render client-side. A 200 response with a broken React app looks "up" to an HTTP check but is broken for users.
- Multi-step forms — Registration, onboarding, or wizard flows where each step depends on the previous one.
- Third-party dependencies — Payment processors, auth providers, or CDNs that affect the rendered page but not the server response.
Using both together
The smart approach is layered monitoring. Use uptime monitoring as your foundation — it's cheap, fast, and catches the majority of outages. Layer synthetic monitoring on top for critical user journeys where the frontend matters.
In practice, this looks like:
- Uptime checks every 10-30s on all API endpoints (fast feedback, low cost)
- Synthetic tests every 5-15min on 2-3 critical user flows (slower, more expensive, but catches UI-level issues)
The uptime layer tells you immediately when infrastructure breaks. The synthetic layer catches the subtle failures that only show up when you render the actual page.
Bridging the gap with assertions
Modern uptime monitoring has gotten smarter. With assertion types like JSON path validation, regex matching, and header checks, you can catch many issues that previously required synthetic tests. Checking that $.data.products returns a non-empty array, or that a response header contains the right cache policy, closes much of the gap.
PulseAPI supports 7 assertion types — status code, response time, body contains, body regex, JSON path, header exists, and header equals — which cover the vast majority of API monitoring needs without the overhead of browser-based synthetic tests.
Start with uptime monitoring. Add synthetic tests only when you have specific user journeys that can't be validated at the HTTP level. Don't over-engineer your monitoring stack before you need to.