- Home
- Monitoring
- 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
- Amsterdam97ms200 · ok
- London142ms200 · ok
- TTFB55 ms
- JSON pathstatus.database
- Bodyvalid JSON
Illustrative example
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.
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.
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.
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) |
| Since | 14:02:11 UTC |
| Target | api.clienta.com/v1/health |
| Next step | Check 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)
reply /ack or acknowledge · open incident
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 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.
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.
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.
How to set up api monitoring in 30 seconds
Enter the target
Add the endpoint URL and choose the JSON API type, and Tenium fills in a sensible timeout and default confirmation settings.
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.
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.
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.
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
API monitoring by plan
| Free $0/mo | Starter $7/mo | Pro $29/mo | Agency $59/mo | |
|---|---|---|---|---|
| Full monitor set | — | ✓ | ✓ | ✓ |
| Monitors | 30 | 100 | 300 | 1000 |
| Fastest interval | 5 min | 1 min | 30 s | 30 s |
| Regions | 1 | 2 | 2 | 2 |
| Custom headers | — | — | ✓ | ✓ |
| Response-time alerts | — | — | ✓ | ✓ |
| Escalation to a second contact | — | — | ✓ | ✓ |
| Status pages | 1 | 3 | 10 | Unlimited |
JSON/API, DNS, UDP, heartbeat, SSL / domain and change checks start on Starter; HTTP(S), keyword, ping and port checks are on every plan.
Other monitor types
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.