Registry Watch
Subscribe to a domain. When what it publishes for AI agents changes — its ai-catalog.json entries, its llms.txt, its agents.md, or the AI-bot rules in its robots.txt — a signed webhook wakes you. Backed by the Desvela ARD index, re-checked weekly. Free during beta.
What it watches
| Surface | Change events |
|---|---|
/.well-known/ai-catalog.json | surface_appeared / changed / gone — plus per-entry events: entry_added / entry_changed / entry_gone (an MCP server or AI service listed by the domain appeared, changed, or was withdrawn) |
/llms.txt | surface_appeared / changed / gone |
/agents.md | surface_appeared / changed / gone |
robots.txt AI directives | surface_changed — the domain started or stopped allowing GPTBot, ClaudeBot, PerplexityBot, Google-Extended… |
Checks run weekly (Sundays ~06:00 UTC), right after the index refresh. Change detection is hash-based on the raw content — cosmetic edits count, HTTP flakiness does not: a fetch error never fires an event by itself.
Quickstart
curl -X POST https://registry.desvela.dev/watch \
-H 'Content-Type: application/json' \
-d '{
"domain": "example.com",
"webhook_url": "https://your-endpoint.example/hooks/ard"
}'
Response — store both tokens now, they are not retrievable later:
{
"id": 42,
"domain": "example.com",
"manage_token": "…", // manages the watch (GET / DELETE)
"secret": "…", // verifies webhook signatures
"baseline": "index" // "live" if we crawled the domain just now
}
webhook_urlmust be https on a public hostname.- Optional
kinds: any subset of["ai_catalog","llms_txt","agents_md","robots_ai"]. Default: all four. - Domain not in the index yet? We crawl it on the spot and it joins the weekly refresh (
"baseline": "live"). - Limit: 20 active watches per webhook URL.
Via MCP
Point any MCP client at https://registry.desvela.dev/mcp (no auth) and your agent gets two tools:
preflight(domain)— what a domain publishes for agents, right now. Free forever.watch(domain, webhook_url)— subscribe in one call; returns the samemanage_token+secret.
The intended loop for an autonomous agent: preflight a dependency before relying on it → watch it → carry on → the webhook wakes you the week its contract changes.
Manage a watch
# Status + last 5 deliveries curl https://registry.desvela.dev/watch/42 \ -H 'Authorization: Bearer YOUR_MANAGE_TOKEN' # Unsubscribe (soft delete; delivery history is kept) curl -X DELETE https://registry.desvela.dev/watch/42 \ -H 'Authorization: Bearer YOUR_MANAGE_TOKEN'
Webhook payload
One POST per week per watch, only when something changed. All events since your last successful delivery ride together:
{
"watch_id": 42,
"domain": "example.com",
"events": [
{ "type": "surface_changed", "kind": "llms_txt",
"status": "present", "content_hash": "…",
"at": "2026-07-18T05:12:44.000Z" },
{ "type": "entry_gone",
"urn": "urn:air:example.com:mcp:orders",
"at": "2026-07-18T05:12:44.000Z" }
],
"observed_at": "2026-07-18T06:00:01.000Z"
}
Headers: X-Desvela-Signature: hmac-sha256=<hex> and User-Agent: Desvela-Registry/0.1 (+https://desvela.dev/bot).
Verify the signature
Same scheme as every Desvela product — one verifier covers Brand Watch and Registry Watch. HMAC-SHA256 of the raw request body with your watch's secret:
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(rawBody, header, secret) {
const expected = 'hmac-sha256=' +
createHmac('sha256', secret).update(rawBody).digest('hex');
return timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}
Delivery & retries
- 3 attempts with backoff (2s, 4s, 6s); 10s timeout per attempt. Redirects are refused — point us at the final URL.
- Any 2xx counts as delivered.
- Nothing is lost on failure: the cursor only advances on a successful delivery, so an undelivered diff is retried — merged with any new changes — on the next weekly run.
- 5 consecutive failed deliveries deactivate the watch (check status with your
manage_token).
FAQ
What does it cost? Nothing during the beta. If that changes, active watches get notified through their own webhook first — you will never discover a price by being charged it.
Why weekly and not real-time? The agent-readable web moves slowly (see the census) and polite crawling matters more than latency. If your use case needs faster detection, tell us: hello@desvela.ai.
How is this different from Brand Watch? Brand Watch monitors what AI engines say about your brand. Registry Watch monitors what a domain publishes for AI agents. Same watchman, opposite directions.
Does watching a domain crawl it harder? No. Watches read the shared index; the domain is fetched once per week regardless of how many watchers it has, by DesvelaBot, robots.txt respected.