Switching from UptimeRobot? Import your monitors in one click with a read-only API key.Start free →
  1. Home
  2. Monitoring
  3. API monitoring

API monitoring with JSON assertions and request bodies

Call a REST endpoint on a schedule with the method, body and credentials it needs, then assert on the status code and a value inside the JSON response.

  • 30 monitors free
  • No credit card
  • Failures confirmed from other regions
api.clienta.comGET /v1/health · JSON status.database = ok
Up
  • Amsterdam97ms200 · ok
  • London142ms200 · ok
  • TTFB55 ms
  • JSON pathstatus.database
  • Bodyvalid JSON

Illustrative example

Try it

Check it now, in your browser

No account. API monitoring: type a target and see roughly what it looks at. Nothing you type is stored.

One real request from a Tenium checker. It follows redirects and reads the certificate. Nothing is saved.

The public test makes a plain GET. JSON assertions, request bodies and auth headers belong to a saved monitor.

The result appears here.

Create this monitorOpen the full tool

What it checks

What a api monitor looks at

Methods and body

GET, HEAD, POST, PUT, PATCH or DELETE with a request body. A body that starts with { or [ is sent as application/json automatically.

Authentication

Basic auth is available on every plan. Arbitrary headers such as Authorization: Bearer ... need the Pro plan.

JSON assertion

Point at a path such as status.database or items[0].id and give the value it must equal. A missing path fails the check, so does a body that is not valid JSON.

Latency

The response time is recorded on every call. On Pro a slow threshold alerts when the average of the last three checks is above it.

Alerts

API monitoring: what an alert looks like

The same event arrives as an e-mail, a Telegram message or a Slack card. This is the wording the channels send; the host, times and numbers are made up.

To [email protected]

Subject [DOWN] api.clienta.com/v1/health — JSON path "status.database" is "down", expected ok

DOWN

api.clienta.com/v1/health

api.clienta.com/v1/health · JSON path "status.database" is "down", expected ok · confirmed from Amsterdam (AMS), London (LON)

ErrorJSON path "status.database" is "down", expected ok
Confirmed byAmsterdam (AMS), London (LON)
Since14:02:11 UTC
Targetapi.clienta.com/v1/health
Next stepCheck the server / hosting panel. Acknowledge so the team knows you are on it.

AcknowledgeOpen incident

{"status":{"api":"ok","database":"down"}}

Tenium · checked from Amsterdam · 14:02 UTC

Tenium alerts

🔴 DOWN · api.clienta.com/v1/health · JSON path "status.database" is "down", expected ok · confirmed from Amsterdam (AMS), London (LON)

TTenium APP 2:02 PM

DOWN · api.clienta.com/v1/health
api.clienta.com/v1/health · JSON path "status.database" is "down", expected ok · confirmed from Amsterdam (AMS), London (LON)

  • Error: JSON path "status.database" is "down", expected ok
  • Confirmed by: Amsterdam (AMS), London (LON)
  • Target: api.clienta.com/v1/health

AcknowledgeOpen incident

Check the server / hosting panel. Acknowledge so the team knows you are on it. · checked from Amsterdam

API monitoring: e-mail, Discord and Google Chat work on every plan; Slack, Telegram, Teams and Mattermost start on Starter. There are no SMS or voice-call alerts.

Response time

Response time with a threshold

Every check stores how long the response took. API monitoring: drag the threshold and see when a slow-response alert would have fired.

Response time Threshold illustrative data
Response time with a threshold. Illustrative data. 0125250375500 Threshold 300 ms 00:0006:0012:0018:0024:00 Response time (ms)
Rule. API monitoring: the alert fires when the average of the last 3 checks is above the threshold (Pro and Agency).
Speed

How fast you find out

Pick a plan to see its check interval and how long a failure takes to reach you, including the confirmation round.

Checks every30 s
On average you hear after15 s
At worst90 s
Checks everyConfirmation window (up to 60 s)

API monitoring: a failure lands at a random moment between two checks, so on average you wait half an interval, and the worst case is a whole interval plus the confirmation window. A single failing region is not enough: all two regions must agree before an incident opens. The other regions are asked straight away, and we allow up to 60 seconds for the answers.

Setup

How to set up api monitoring in 30 seconds

1

Enter the target

Add the endpoint URL and choose the JSON API type, and Tenium fills in a sensible timeout and default confirmation settings.

2

Pick an interval

Fastest check interval: 30 s on Pro and Agency, 1 min on Starter, 5 min on Free. Slower intervals are available on every plan.

3

Add the JSON path

Choose who is told. Email, Discord and Google Chat work on every plan, Slack, Telegram, Teams and Mattermost start on Starter, webhooks on Pro.

4

Save

The first check runs within seconds. If a check ever fails, other regions re-check it before an incident opens, so one bad route does not page you.

Failure modes

What each error means

This is the text an incident shows in its Error line, the usual cause, and the first thing to look at.

JSONJSON path "status.database" not found

The response parsed but the field is gone: a renamed key, a changed API version or an error body. A missing path fails the check.

Shown as: JSON path "status.database" not found

JSONJSON path "status.database" is "down", expected ok

The endpoint answers 200 while saying a dependency is broken. This is the failure plain status checks miss.

Shown as: JSON path "status.database" is "down", expected ok

PARSEResponse is not valid JSON

An HTML error page, a proxy message or a truncated body arrived instead of JSON. Look at the response excerpt in the incident.

Shown as: Response is not valid JSON

HTTP 401401 Unauthorized

The credentials are wrong or expired, usually a rotated token. The check fails until you update the Authorization header (Pro).

Shown as: 401 Unauthorized

TIMEOUTTimeout after 10 s

The API did not answer in time. Compare with the slow-response average in the chart to see if it was degrading first.

Shown as: Timeout after 10 s

Plans

API monitoring by plan

Free
$0/mo
Starter
$7/mo
Pro
$29/mo
Agency
$59/mo
Full monitor set—✓✓✓
Monitors301003001000
Fastest interval5 min1 min30 s30 s
Regions1222
Custom headers——✓✓
Response-time alerts——✓✓
Escalation to a second contact——✓✓
Status pages1310Unlimited

JSON/API, DNS, UDP, heartbeat, SSL / domain and change checks start on Starter; HTTP(S), keyword, ping and port checks are on every plan.

Full pricing

Start with an endpoint that tells the truth

The most valuable API monitor is not a call to your busiest endpoint; it is a call to a health route that checks what matters. A shallow route that returns {"ok":true} proves only that the process runs. A route that touches the database and the queue and reports each one separately gives you something to assert on:

{"status":"ok","database":"ok","queue":"ok","version":"4.12.1"}. With the JSON API monitor type you point at one value in that document, for example database, and name the value it must have. When the database connection dies, the route still answers 200, the JSON no longer matches, and the incident says exactly which value was wrong. Keep the route cheap and unauthenticated, or protected only by a secret header, so that monitoring does not become a source of load.

How the assertion is evaluated

The response body is parsed as JSON; if parsing fails the check fails with "Response is not valid JSON". Your path is then resolved: dots walk into objects, a number or [0] indexes arrays, and an optional leading $ is accepted, so status.database, $.status.database and items[0].id are all valid. A missing path fails with "JSON path not found". If you also give an expected value, the actual value must equal it. Strings compare case-insensitively, numbers and booleans compare by their text form (true, 42), and objects or arrays compare as JSON.

That is deliberately equality only. There is no "less than" or "contains" operator today. When you need a threshold, have the API compute the verdict and publish it as a value: queue_ok:true is easier to assert than queue_depth<100. If you give a path with no expected value, the check simply requires that the path exists.

Methods, bodies and credentials

Any of GET, HEAD, POST, PUT, PATCH and DELETE can be used. A request body is sent for everything except GET and HEAD, and if it starts with { or [ and you did not set a content type, it goes out as application/json. Authentication has two tiers. Basic auth is a field in the advanced section on every plan. Bearer tokens and API keys in headers need the Pro plan, because custom headers are a Pro feature; the editor tells you so rather than silently dropping them.

Be careful with methods that change data. A POST every minute is 1,440 writes a day, and a monitor that creates a record needs a cleanup story. Prefer idempotent reads, a dedicated read-only token, or an endpoint built for probes. Never aim a DELETE monitor at production data.

Expecting the "wrong" status on purpose

The expected status field is a contract check as much as an uptime check. Calling a protected endpoint without a token and expecting 401 proves the auth layer is alive and not failing open. Expecting 404 on a path that must stay hidden is a cheap regression test for a routing change. For a rate-limited public API, 200,429 keeps a throttled response from paging you while still failing on 500 and 502. You can combine ranges and single codes in one list.

Latency and the slow threshold

Every call stores its response time. On Pro and Agency, set a slow threshold in milliseconds and Tenium compares it with the average of the last three checks, opening a degraded incident rather than a down one when it is exceeded. Averaging three values avoids reacting to one cold start, while still noticing a regression within a few minutes at a one-minute interval. Because the average is across checks that may come from different regions, a threshold should allow for the extra distance to the farthest checker.

Limits worth knowing

Each monitor is one request. There is no chaining (login, then call with the token), no response schema validation, and no assertions on headers. Bodies are read up to about 1 MB without compression, so a very large listing endpoint is a poor choice for a monitor. JSON assertions start on the Starter plan at $7 a month; on Free the same URL can still be watched as a plain website monitor for status and speed. If your API sits behind a WAF, add the checker addresses to the allow list so a challenge page does not appear as a failed assertion.

API monitoring questions

Which JSON path syntax is supported?

Dot notation with optional bracket indexes: status.database, items[0].id or $.data.count. Keys that contain dots or spaces cannot be addressed, so expose a simple alias if you need one.

Can I assert that a number is below a limit?

Not directly, since matching is equality. Make your endpoint return a boolean or a status word that already contains the decision, then assert on that value.

Are my tokens safe in a monitor?

Use a read-only token created just for monitoring, and rotate it like any other credential. The Pro plan accepts any request header, so scope the token to the single route you check.

Can one monitor call several endpoints in sequence?

No. Create one monitor per endpoint. Chained requests and multi-step flows are not part of the product today.

Start api monitoring free

30 monitors on the Free plan, no card needed, with failures confirmed from other regions (2 regions live today). Upgrade when the client list grows.