Pricing
One price, both rails, one wallet — the same Ounie credits every other Ounie app draws. No subscription, no plan to pick, no minimum, and no discounted recurring rate you would have to reason about.
A check
3credits
$0.03 per call
One look at one page, compared against the baseline you supply. Includes the render, the extraction, the diff and a visual snapshot.
A monitor pass
3credits
hourly · daily · weekly
The identical price, because it is the identical work. Up to 50 active monitors. Creating one is free; you pay only for passes that actually ran.
Agents · x402
$0.036USDC
no account, no key
Pay per call on Base. Sells one check against your baseline. Not monitors — there is no wallet to bill on renewal and nowhere to deliver.
https://watch.ounie.com/api/x402/checkMost of the time, the answer is no change — and that is billed, because somebody had to go and establish it. A watch that only charged when something happened would be a watch with a reason to find things.
What is never billed is a non-answer: a page that rendered nothing readable, with no baseline to compare it against. On credits that refunds pool-exact. On x402 it is refused before the payment settles, because a settlement on chain is final and there is no refund to give.
Buy credits on OunieQuestions
Normalisation, before anything is compared. By default we mask timestamps, relative_times, tokens, cache_busters: timestamps in every form, "3 minutes ago", CSRF and nonce values, long opaque hashes, and cache-busting query parameters. Whitespace, line wrapping and invisible spaces are always normalised. In the default scope the renderer has already dropped navigation, footers, asides and advertising. Everything else — prices, counts, versions, copyright years, and the ORDER of a list — is compared exactly as it is.
A change that consists only of something we mask. If the page you care about genuinely publishes a meaningful date — an event that moved, a deadline that shifted — pass `ignore_volatile: []` and we compare raw, or narrow to a selector so the date is the only thing in scope. The defaults are defaults, not a ceiling, and every class can be turned off individually.
Because we could not deliver it. A recurring watch has to bill somebody on every renewal and has to have somewhere to push the alert. A keyless caller has no wallet we can draw again and no account to hold a webhook against. Selling a subscription we cannot renew would be selling something that does not exist — so x402 buys one check, and you keep the schedule by passing the previous snapshot_id as your next baseline.
No. Two renders of an unchanged page produce different pixels constantly — a lazy image lands a frame later, a font swaps, an animation is mid-frame. Comparing screenshots would report a change on nearly every pass. The picture is evidence a human looks at; the text extraction is the verdict.
No, deliberately. Selectors and a field map, evaluated the same way every time. A model's output is not reproducible across runs or model versions, so two identical pages would routinely extract differently and be reported as changed — and every false report would cost you credits and fire your webhook. That is why `schema` here is a map of name → CSS selector rather than a JSON Schema document, and why we refuse one rather than quietly doing something else.
3 Ounie credits — $0.03 in plain money, from the same wallet as every other Ounie app. A monitor pass costs exactly the same, because it does exactly the same work. Reading a result, listing your history and reading a monitor's delivery log are free forever.
Yes, and that is the answer you are paying for. "No change" is a fact somebody had to go and establish. What is never charged is a check where the page yielded nothing at all and there was no baseline to compare against — that taught you nothing, so it refunds in full.
The pass is skipped, not failed. Nothing is reserved, the monitor stays due, and the very next tick after you top up runs it. Your monitor does not need restarting and nothing needs clearing — the dashboard just says why the last pass did not happen.
No. Non-public addresses — localhost, link-local, private ranges, cloud metadata, .internal and .local names — are refused for free, before any price is quoted, on both rails. The same refusal applies to a webhook URL, so a monitor cannot be turned into the thing a check refuses to be. DNS can still rebind a public name after the check, so this is an honest refusal rather than a full egress firewall, and it says so in the docs.
Every delivery carries `X-Watchtower-Signature: sha256=<hmac>` over the exact bytes we sent, keyed with the secret shown once when you create the monitor. Verify it and nobody who merely learns your URL can feed you a forged alert. Failed deliveries are logged and visible — a monitor that has been 500ing for a week should never be a mystery.
Up to 50 active at once, hourly, daily or weekly. Pausing one costs nothing and keeps its history. Deleting one keeps its past checks readable.