Synthetic checks from a single vantage point. Version 1 · Reference
The Probe API runs on-demand network checks and returns the raw result. It is intended for scheduled monitoring jobs and for ad-hoc diagnostics from CI. There is no dashboard and no retention: every call is executed when it arrives and the result is returned inline.
All requests go to a single origin. The project key is the first path segment — there is no
Authorization header and no cookie:
https://a.notyourbusiness.club/{project_key}/{endpoint}
project_key is 32 lowercase hexadecimal characters. Keys are issued per project and
are not shared between environments. Rotating a key takes effect immediately; the previous key
stops working with no grace period, so roll the new value out to your runners first.
| Method | Path | Purpose |
|---|---|---|
| GET | /{project_key}/status | Liveness of the probe node |
| POST | /{project_key}/http-check | Fetch a URL, report timing and status |
| POST | /{project_key}/tcp-check | Open a TCP connection, report handshake timing |
| GET POST | /{project_key}/dns-query | Resolve a name from the probe node |
curl https://a.notyourbusiness.club/$KEY/status
{"ok":true,"node":"probe-1","uptime_s":81422}
Body is JSON. timeout_ms defaults to 5000 and is capped at 10000.
curl -X POST https://a.notyourbusiness.club/$KEY/http-check \
-H 'content-type: application/json' \
-d '{"url":"https://example.com/health","timeout_ms":3000}'
{
"status": 200,
"connect_ms": 12,
"tls_ms": 31,
"total_ms": 94,
"bytes": 1256
}
curl -X POST https://a.notyourbusiness.club/$KEY/tcp-check \
-H 'content-type: application/json' \
-d '{"host":"db.internal.example","port":5432}'
{"reachable":true,"connect_ms":8}
Resolves a name from the probe node and returns the answer as received, without post-processing. Two request formats are accepted.
Wire format. Send a DNS message with content type
application/dns-message. On POST the message is the request
body; on GET it goes in the dns query parameter as
base64url without padding. The response is a DNS message with the same content type. This is
the format the reference runner uses, because it round-trips EDNS options and DNSSEC records
untouched — useful when the thing you are debugging is the resolver itself.
curl -H 'accept: application/dns-message' \
--data-binary @query.bin \
-H 'content-type: application/dns-message' \
https://a.notyourbusiness.club/$KEY/dns-query --output answer.bin
Caching. Responses carry Cache-Control: max-age derived from the
smallest TTL in the answer, so an HTTP cache in front of your runner will not serve a record
past its lifetime. A failed lookup is returned with max-age=0.
NXDOMAIN, SERVFAIL,
REFUSED — is still 200 OK at the HTTP layer, with the condition
encoded in the message. Non-2xx status codes mean the request itself was malformed, throttled
or unauthenticated. Check the DNS response code, not just the HTTP one.
| Status | Meaning |
|---|---|
400 | Malformed body, unsupported content type, or a query that failed validation |
404 | Unknown project key, or a path that is not an endpoint of this API |
413 | Request body over 4096 bytes |
429 | Rate limit exceeded; retry after the interval in Retry-After |
Unknown keys and unknown paths deliberately return the same bare 404 with no body
detail. This is not an oversight: it keeps the API from confirming whether a given key exists to
someone who is guessing.