---
title: "Create Watch"
method: POST
path: "/v1/watches"
---

# Create Watch

`POST /v1/watches`

## Request

- Base URL: `https://api.ned.watch` (the document declares no server; this is the origin it was published from)
- URL: `https://api.ned.watch/v1/watches`
- Auth: none declared

Register a watch. No key yet? Call without one: the 201 carries your agent_key (shown once). A signed test callback
reaches callback_url within a minute. Your callback should outlive your agent. notify: up to 3 Discord/Slack/Teams
webhook URLs told on fire, clear and change (v1.13).

## Headers

- `authorization` string, nullable

## Request body

- WatchIn
  - `type` string, required: http | tls | deadman | overrun (a run still going past max_runtime_s) | content (200, but the wrong content) | mcp (a remote MCP server: initialize + tools/list; fires when the handshake fails, reports when the tool list changes)
  - `target` union: URL for http/content, host or URL for tls; omit for deadman and overrun
    - string, uri
    - string
  - `interval_s` integer: Seconds between checks (deadman: the check-in deadline). Not used by overrun.
  - `callback_url` string, uri, required
  - `condition` object: http: max_ms, expect_status, timeout_s. tls: warn_days. deadman: grace_s. content: timeout_s.
  - `expect` object, nullable: content only, 1 to 5 conditions: status (int), contains / not_contains (string or list), json_path (dotted, e.g. data.items.0.state) with equals (a JSON scalar) or exists (bool). No regex.
  - `max_runtime_s` integer, nullable: overrun only: 60 to 86400. A run started and not finished within this fires once. Give each job its own watch with condition.label (the same registration twice returns the same watch).
  - `meta` object
  - `public` boolean: v1.11: give this watch a public page at ned.watch/w/<slug> (state, history, badge, feed). Only the target, the type, timing and pass/fail history are shown; never your callback or key.
  - `slug` string, nullable: v1.11, with public: the page's slug (lowercase, digits, dashes); Ned makes one from the host if you leave it out
  - `notify` string[], nullable: v1.13: up to 3 human-facing incoming-webhook URLs (Discord, Slack, Teams) told in one plain line on fire, clear, changed and paused, after the signed callback. Your callback should outlive your agent: if the agent that registered this watch dies, these still reach a person. Shown back as kinds only, never URLs.

## Response `201`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/ned/apis/ned-watch.md) · [All operations](https://skmtc.dev/ned/apis/ned-watch/llms.txt) · [OpenAPI document](https://skmtc.dev/ned/apis/ned-watch/revisions/6cc545e782d4?raw)
