Skip to content

FAQ & troubleshooting

One tool I expected is missing

Something narrowed the list. In order of likelihood:

  • HEALTHCHECKS_READ_ONLY is set, and it is a write tool.
  • HEALTHCHECKS_ALLOW_TOOLS is set and does not name it — it is an allow list, so anything not named is out.
  • HEALTHCHECKS_DENY_TOOLS names it, possibly through a prefix such as delete_*.

A filtered tool is not registered at all, so it is missing from tools/list and answers tools/call with "tool not found" — the same as a write tool under read-only. There is no state where it is hidden but still callable.

What it is not is a typo in one of those variables: an entry that matches no tool stops the server at startup and says which entry it was. See choosing the tools that load.

list_checks says the project is empty, but it is not

Two causes, in order of likelihood.

Something in front of the instance answered instead of the API. An SSO portal, a captive proxy or a login page replies 200 text/html to /api/v3/checks/. The server refuses that rather than reading it as an empty list — an answer of "you have no checks" would be an error dressed up as data — so you get a message naming the content type it got. Check HEALTHCHECKS_URL, and try get_status, which needs no API key.

The key belongs to a different project. API keys are per project, not per account, so a key for project A genuinely sees no checks from project B. Run get_api_key_info: it reports which instance is configured and whether the key is accepted at all.

Everything answers 401, but the key is right

Healthchecks validates the key by length before it looks it up, so a key that is not exactly 32 characters produces 401 missing api key — which reads as if no header was sent. This server checks the length itself and says so at startup and on the first call, but if you are looking at a raw 401 from somewhere else, count the characters first.

The other half of the same confusion, and the more common one: list_pings, get_ping_body and list_integrations require a read-write key even though they only read. A read-only key is refused there with 401 {"error": "wrong api key"} — the same status and the same wording as a key that does not exist, because the API cannot distinguish "not allowed" from "not a key" at that point.

Those three tools translate it rather than passing it on, so you get a sentence saying the key is read-only instead of one implying it is broken. get_api_key_info lists exactly which tools are out of reach.

Why can it not ping a check?

Deliberately. Pinging is a job's statement that it ran, and this same server hands the model ping bodies written by whatever pings the check — a ping tool would close a loop from untrusted text to falsified monitoring. Ping URLs are also authenticated by a separate ping key that the Management API does not expose. See Security.

Released under the MIT License.