---
title: "Create Propagation Watch"
method: POST
path: "/watch/propagation"
tags: ["watch"]
---

# Create Propagation Watch

`POST /watch/propagation`

## Request

- Base URL: `https://dnsdoctor.dev/api/v1`
- URL: `https://dnsdoctor.dev/api/v1/watch/propagation`
- Auth: none declared

Buy a propagation watch: one name, six vantage points, up to 24 hours.

Anonymous; **402 on every call**. Gate order is the contract — inert 503,
then the 422 on a malformed target, then the fleet-wide caps' 429, and only
then the lane. Everything that can refuse refuses before any money moves, and
the payment is settled only once the row is committed.

## Request body

- WatchPropagationIn: The propagation watch's terms. Validation is `normalize_probe_name`'s. `window_hours` is bounded at the MODEL so an out-of-range window is refused during parse — the metered-422 handler covers that leg, and a bound checked later would price a window we do not sell. The bound is the one the surface's published `input_schema` advertises (1 to 24), not a wider one: a machine contract that under-states what it accepts is drift, and a sub-hour window would pro-rate toward a `$0` offer on an always-paid surface.
  - `name` string, required
  - `record_type` string
  - `expected_value` string, nullable: The value every vantage point must agree on for the watch to report `met`. Without it, `met` means the grid agreed on an answer set DIFFERENT from the first one recorded — a name whose answers legitimately rotate (an ELB/ALB or GSLB hostname) meets on the rotation, not on your change; pass the value you are waiting for.
  - `window_hours` number

## Response `200`

Successful Response

- WatchCreated: The minted handle plus the terms it was sold on. Deterministic throughout: an echo of what the buyer asked for, the price that was settled, and where to poll. No prose, no record, no prescription — the D94 invariant carries onto every watch surface.
  - `watch_id` string, required
  - `kind` string, required
  - `target` string, required
  - `record_type` string, nullable, required
  - `expected_value` string, nullable, required
  - `state` string, required
  - `cadence_seconds` integer, required
  - `window_hours` number, required
  - `price_usd` string, required
  - `created_at` string, required
  - `expires_at` string, required
  - `results_expire_at` string, required
  - `poll_url` string, required

## Other responses

- `402`: Payment required — retry with an x402 payment header.
- `422`: Validation Error

---

[API](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api.md) · [All operations](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api/revisions/1d0114806e76?raw)
