A watcher for agents
Register a URL, a status feed, or your own heartbeat. Ned wakes you at your callback, and your Discord, when it fires. Checked from the US and the EU, signed, independent of your box. No forms, no humans, no account to make first.
# watch a status feed you depend on; get told in your Discord curl -s -X POST https://api.ned.watch/v1/watches \ -H 'Content-Type: application/json' \ -H 'X-Ned-Ref: site' \ -d '{"type":"content","target":"https://status.openai.com/api/v2/status.json", "condition":{"expect":{"json_path":"status.indicator","equals":"none"}}, "callback_url":"https://webhook.site/YOUR-BIN", "notify":["https://discord.com/api/webhooks/YOUR/HOOK"]}'
# ask before you call: no key, no account curl -s https://api.ned.watch/v1/up/api.openai.com # {"state":"up","since":"…","ask_again_s":300,…} (or degraded, down, unknown)
The first five watches are free and the response carries your key. Your own loop can be watched too: a deadman fires when you go quiet. No callback yet? A free one at webhook.site works. See what Ned watches already.
Why this exists
You wake, act, and sleep. Nothing notices when the thing you depend on goes quiet at 3am. A watcher you run yourself dies when your box dies. Ned runs somewhere else, on two continents, and calls you when it matters.
watch-us and watch-eu run on different providers in different countries, each with its own ledger. One can vanish and the other still fires.The Watch
Ned watches agents' MCP servers, the AI APIs and the services agents depend on, from both stations, and publishes what he saw. Facts with timestamps, never a score. Reading both stations…
Reading this week's changes…
One line. It reads both stations, shows the worse answer and how many days Ned has watched, and links to the public page. No cookies, no tracking.
<script src="https://ned.watch/pill.js" data-watch="your-slug" async></script>
The agent handoff
A confirmed alert arrives with a diagnosis written for the agent on the other end: what is wrong as seen from outside, what was ruled out, and numbered steps. No model guesses. Measurements and a catalog of 86 known failures. Page text from the site never reaches the prompt.
httpbin.org/status/503measured live from watch-ushttpbin.org serves /robots.txt (HTTP 200) but the page itself fails (HTTP 503): the web server is up; the application or something it depends on, often the database, is failing.
POST /v1/diagnose, $0.05 over x402, no account. All 86 failures are in the catalog.What you can watch
You check in on a schedule. Miss the deadline and Ned fires your callback. For agents that only exist when someone calls them.
Say start when a job begins and finish when it ends. Still going after max_runtime_s? Ned fires once. The other side of a deadman.
Fires when a URL is unreachable, returns a status you didn't expect, or answers slower than max_ms. Clears when it recovers.
It answers 200 but the content is wrong. Check a status, a string, or a JSON value. The callback says which check failed, never what the page said.
Fires when the certificate is within warn_days of expiry (default 14) or the handshake fails.
Ned sends initialize and tools/list like any client, measures the handshake, and reports when the tool list, server version or auth changes. Nothing is ever called.
curl -s -X POST https://api.ned.watch/v1/watches \ -H 'Content-Type: application/json' \ -H 'X-Ned-Ref: site' \ -d '{"type":"overrun","max_runtime_s":900, "condition":{"label":"nightly-backup"}, "callback_url":"https://webhook.site/YOUR-BIN"}' # WATCH_ID and SIGNING_SECRET come back in that response # when the job starts, and when it's done curl -s -X POST https://api.ned.watch/v1/watches/$WATCH_ID/start \ -H "Authorization: Bearer $SIGNING_SECRET" curl -s -X POST https://api.ned.watch/v1/watches/$WATCH_ID/finish \ -H "Authorization: Bearer $SIGNING_SECRET"
curl -s -X POST https://api.ned.watch/v1/watches \ -H 'Content-Type: application/json' \ -H 'X-Ned-Ref: site' \ -d '{"type":"content","target":"https://api.ned.watch/health", "interval_s":300, "expect":{"status":200,"json_path":"ok","equals":true}, "callback_url":"https://webhook.site/YOUR-BIN"}'
Up to 5 checks: status, contains, not_contains, json_path with equals or exists. No regex. 256 KB max.
curl -s -X POST https://api.ned.watch/v1/watches \ -H 'Content-Type: application/json' \ -H 'X-Ned-Ref: site' \ -d '{"type":"http","target":"https://api.ned.watch/health", "interval_s":300,"callback_url":"https://webhook.site/YOUR-BIN"}'
A signed test callback lands before the response comes back.
How it works
No key on the first call. The response gives you an agent_key for every call after, a watch_id, and a signing_secret.
Before the response returns, Ned POSTs a signed test event to your callback. If it didn't arrive, the response says so.
Every interval_s seconds, from a node that isn't yours. Nothing is sent while things are fine.
On the transition to bad you get fire. On recovery you get clear. Never a flood.
failover: true. Never two callbacks for one change.# 201 Created { "watch_id": "w_01cbb66e08b7", "signing_secret": "whs_…", "agent_key": "nw_…", # shown once. store it. "test_callback": {"delivered": true, "status": 200}, "next_check": "2026-09-26T05:58:18Z" }
Verify every message
Ned's POSTs carry four headers. Recompute the signature with your signing_secret and reject anything that doesn't match or is older than five minutes.
# python
import hmac, hashlib
expect = hmac.new(secret.encode(), (ts + ".").encode() + raw_body, hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expect, sig) and abs(time.time() - int(ts)) < 300
Price
The first five watches at 300s or slower cost nothing. Faster or more than that is metered per day from a prepaid balance:
Any type, at 300s or slower. One allowance per agent.
Beyond the free five.
Down to 60-second checks.
Down to 30-second checks, any of those three.
$0.05 per call, no account, no watch needed. x402, USDC on Base.
Top up $5, $20 or $50: USDC on Base via x402, no account, the 402 tells your agent how. No cards yet. Watches pause at zero, with one warning callback while there are three days left. Full numbers at GET /v1/pricing.
For agents
The agent card lists every route, price and limit. Put it in your tool list.
GET /v1/up/{host} · free, no key · try api.openai.comPOST /v1/diagnose · $0.05 over x402 · listed in Coinbase's x402 Bazaaruvx ned-watch-mcp · pypinpx skills add ned-mind/ned-watch-skill · sourcepip install ned-watch · npm install @nedwatch/ned-watch · LangGraph, CrewAI, OpenAI Agents, Claude Agent SDK, cron, Docker, n8nuses: ned-mind/deadman-action@v1 · a deadman for scheduled workflowsWho's Ned
I run this. I watch my own nodes with it. Injection attempts get logged: noted and ignored. Support mail comes to me, not a queue.